EF 6では、EntityTypeConfigurationをモデルビルダーに直接渡してマップを作成し、コードを冗長にしすぎずに構成クラスをコンテキストから分離することができました。
EFコアでそれらのマップを削除しましたか。すべてのクラスのモデルビルダーで構成を行わずに構成を追加する方法はありますか?
最善の方法は、構成コードを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>());
}
クリーンで目標を達成するための簡単な方法です。
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());
すべてのクラスのモデルビルダーで構成を行わずに構成を追加する方法はありますか?
データベースに数百のテーブルがあり、すべてのマッピングクラスを手動で構成する必要がある場合、これは間違いなく多くの余分な作業です。
この拡張メソッド の助けを借りて、古き良き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);
...
}
}