web-dev-qa-db-ja.com

EntityFrameworkのコア構成

EF 6では、EntityTypeConfigurationをモデルビルダーに直接渡してマップを作成し、コードを冗長にしすぎずに構成クラスをコンテキストから分離することができました。

EFコアでそれらのマップを削除しましたか。すべてのクラスのモデルビルダーで構成を行わずに構成を追加する方法はありますか?

12
Jajan

最善の方法は、構成コードをOnModelCreatingメソッドから遠ざけることです。したがって、次のようなことができます。

実際の構成を保存するクラスを作成します。

public class ApplicationUserConfiguration
{
    public ApplicationUserConfiguration(EntityTypeBuilder<ApplicationUser> entity)
    {
        // Here you have all the good stuff
        entity.ToTable("user", "identity");

        entity.Property(p => p.Id)
            .HasColumnName("id);

        // And so on ....
    }
}

そして、OnModelCreatingに新しく作成されたクラスをインスタンス化し、正しいエンティティを渡します。

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    // Your custom configs here
    new ApplicationUserConfiguration(builder.Entity<ApplicationUser>());
}

クリーンで目標を達成するための簡単な方法です。

12

EntityFrameworkCore2.0には IEntityTypeConfiguration<TEntity> これは次のように使用できます:

class ApplicationUserMap : IEntityTypeConfiguration<ApplicationUser>
{
  public void Configure(EntityTypeBuilder<Customer> builder)
  {
    builder.ToTable("user", "identity");

    builder.Property(p => p.Id)
        .HasColumnName("id");
     ...
   }
}

...
// OnModelCreating
modelBuilder.ApplyConfiguration(new ApplicationUserMap());
15
user2321864

すべてのクラスのモデルビルダーで構成を行わずに構成を追加する方法はありますか?

データベースに数百のテーブルがあり、すべてのマッピングクラスを手動で構成する必要がある場合、これは間違いなく多くの余分な作業です。

この拡張メソッド の助けを借りて、古き良きEF6のような数行のコードで目的の結果を達成できます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    Type[] types = typeof(EntityTypeConfiguration<>).GetTypeInfo().Assembly.GetTypes();
    IEnumerable<Type> typesToRegister = types
        .Where(type => !string.IsNullOrEmpty(type.Namespace) &&
                        type.GetTypeInfo().BaseType != null &&
                        type.GetTypeInfo().BaseType.GetTypeInfo().IsGenericType &&
                        type.GetTypeInfo().BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));

    foreach (var type in typesToRegister)
    {
        dynamic configurationInstance = Activator.CreateInstance(type);
        ModelBuilderExtensions.AddConfiguration(modelBuilder, configurationInstance);
    }

    base.OnModelCreating(modelBuilder);
}

拡張方法

public abstract class EntityTypeConfiguration<TEntity> where TEntity : class
{
    public abstract void Map(EntityTypeBuilder<TEntity> builder);
}

public static class ModelBuilderExtensions
{
    public static void AddConfiguration<TEntity>(ModelBuilder modelBuilder, EntityTypeConfiguration<TEntity> configuration)
        where TEntity : class
    {
        configuration.Map(modelBuilder.Entity<TEntity>());
    }
}

写像類群

public class UserMap : EntityTypeConfiguration<User>
{
    public override void Map(EntityTypeBuilder<User> builder)
    {
        // Primary Key
        builder.HasKey(t => t.Id);
        ...
    } 
}
8
Win