web-dev-qa-db-ja.com

EF6からEF Core 2.0への移行

EF6xを使用したMVC5プロジェクトをMVCコアおよびEFコアに移動し始めたばかりですが、エンティティの構成に大きな問題があります。 EF6 Fluent構成をEFコアに移行するにはどうすればよいですか?
可能であればサンプル付きのガイドが必要です。

ここに私のマッピングクラスの1つと私の試みがあります

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);
    }

}

これは、Google検索とMicrosoftドキュメントを使用して行いました。しかし、自分の仕事はよくわかりません。 +100の構成クラスがあるので、続行する前に確認します。質問の内容がサイトの利用規約に適合していない場合は、お詫び申し上げます。

12
CS-Beginner

EFコアへの移行に関する良い記事を見つけました。私はそれを共有し、私のような初心者のためにこの質問を続けたいと思います。

コードの更新
名前空間_System.Data.Entity_は_Microsoft.EntityFrameworkCore_に置き換えられました
HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)ValueGeneratedNever();に置き換えられました
DbContextのベースコンストラクターには、接続文字列用の単一の文字列パラメーターがありません。 DbContextOptionsを注入する必要があります
OnModelCreating(DbModelBuilder modelBuilder)OnModelCreating(ModelBuilder modelBuilder)になります。単純な変更ですが、すべて同じように変更します
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());は使用できなくなりました。つまり、EntityTypeConfigurationも使用できないため、すべてのエンティティ構成をOnModelCreatingに移動する必要がありました。
_((IObjectContextAdapter)context).ObjectContext.ObjectMaterialized_は使用できなくなりました。私はそれを使用してDbContextを拡張し、すべての日付を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は投稿ごとに関連しなくなりました
IDbSetDbSetになります
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への移行

17
CS-Beginner