簡體   English   中英

從EF6遷移到EF Core 2.0

[英]Moving from EF6 to EF Core 2.0

我剛剛開始將我的MVC5項目與EF6x一起移植到MVC Core和EF Core,但我的實體配置存在很大問題。 如何將EF6 Fluent配置遷移到EF核心?
如果可能的話,我需要帶樣本的指南。

這是我的一個映射類和我的嘗試

EntityMappingConfiguratuin

public interface IEntityMappingConfiguration
{
    void Map(ModelBuilder b);
}

public interface IEntityMappingConfiguration<T> : EntityMappingConfiguration where T : class
{
    void Map(EntityTypeBuilder<T> builder);
}

public abstract class EntityMappingConfiguration<T> : EntityMappingConfiguration<T> where T : class
{
    public abstract void Map(EntityTypeBuilder<T> b);

    public void Map(ModelBuilder b)
    {
        Map(b.Entity<T>());
    }
}

public static class ModelBuilderExtenions
{
    private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
    {
        return assembly.GetTypes().Where(x => !x.IsAbstract && x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType && y.GetGenericTypeDefinition() == mappingInterface));
    }

    public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
    {
        var mappingTypes = assembly.GetMappingTypes(typeof(IEntityMappingConfiguration<>));
        foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<IEntityMappingConfiguration>())
        {
            config.Map(modelBuilder);
        }
    }
}

的DbContext

public class CommerceServiceDbContext : AbpDbContext
    {
        public CommerceServiceDbContext(DbContextOptions<CommerceServiceDbContext> options) 
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.AddEntityConfigurationsFromAssembly(GetType().Assembly);
        }
    }

簡單的舊配置

public partial class AffiliateMap : EntityMappingConfiguration<Affiliate>
{
    public override void Map(EntityTypeBuilder<Affiliate> b)
    {
        b.ToTable("Affiliate");
        b.HasKey(a => a.Id);
        b.HasRequired(a => a.Address).WithMany().HasForeignKey(x => x.AddressId).WillCascadeOnDelete(false);
    }
}

我的嘗試

public partial class AffiliateMap : EntityMappingConfiguration<Affiliate>
{
    public override void Map(EntityTypeBuilder<Affiliate> b)
    {
        b.ToTable("Affiliate");
        b.HasKey(a => a.Id);
        b.HasOne(a => a.Address)
            .WithMany().HasForeignKey(x => x.AddressId).IsRequired().OnDelete(DeleteBehavior.Restrict);
    }

}

我使用谷歌搜索和微軟文檔完成了這項工作。 但我不確定我的工作。 由於我有+100配置類,我會在繼續之前問你。 如果我的問題內容與網站的條款和條件不符,我深表歉意。

我發現了一篇關於遷移到EF核心的好文章。 我希望與像我這樣的初學者分享並保留這個問題。

代碼更新
命名空間System.Data.EntityMicrosoft.EntityFrameworkCore替換
HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)ValueGeneratedNever();替換ValueGeneratedNever();
DbContext的基本構造DbContext沒有連接字符串的單個字符串參數。 我們現在必須注入DbContextOptions
OnModelCreating(DbModelBuilder modelBuilder) OnModelCreating(ModelBuilder modelBuilder)成為OnModelCreating(ModelBuilder modelBuilder) 簡單的改變,但改變都一樣
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly()); 不再可用,這意味着EntityTypeConfiguration也不可用,所以我不得不將我的所有實體配置移動到OnModelCreating
((IObjectContextAdapter)context).ObjectContext.ObjectMaterialized不再可用。 我正在使用它來擴展DbContext以將out中的所有日期轉換為Utc。 我還沒有找到替代品。
ComplexType不再可用。 我不得不稍微改變模型結構以適應這個。
MigrateDatabaseToLatestVersion不再可用,因此我必須將以下內容添加到我的startup.cs中

using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
    serviceScope.ServiceProvider.GetService<SbDbContext>().Database.Migrate();
}

WillCascadeOnDelete(false)變為OnDelete(DeleteBehavior.Restrict)
根據帖子, HasOptional不再相關
IDbSet變為DbSet
DbSet<T>.Add()不再返回T而是EntityEntry<T>

var entry = context.LearningAreaCategories.Add(new LearningAreaCategory());
//that's if you need to use the entity afterwards
var entity = entry.Entity;

IQueryable<T>.Include(Func<>)現在返回IIncludableQueryable<T,Y>而不是IQueryable<T> ,同樣適用於OrderBy 我所做的是將所有包含和訂單移動到最后。

來源: 從EF6遷移到EF Core

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM