Jar*_*red 8 c# entity-framework entity-framework-core
确实的方式任何人知道或申请从派生的所有类的实现IEntityTypeConfiguration<>对DbContext在运行时?
似乎没有内置任何内容并通过以下方式手动加载每个内容:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new Table1Config())
modelBuilder.ApplyConfiguration(new Table2Config())
...
modelBuilder.ApplyConfiguration(new TableNConfig())
}
Run Code Online (Sandbox Code Playgroud)
对于具有许多表的数据库来说,这将被证明是相当乏味的。
Tan*_*jel 10
您可以按如下方式编写扩展方法:
public static class ModelBuilderExtensions
{
public static void ApplyAllConfigurations(this ModelBuilder modelBuilder)
{
var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetInterfaces()
.Any(gi => gi.IsGenericType && gi.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>))).ToList();
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.ApplyConfiguration(configurationInstance);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在OnModelCreating如下:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyAllConfigurations();
}
Run Code Online (Sandbox Code Playgroud)
从EF Core 2.2您不需要编写任何自定义扩展方法。为此EF Core 2.2添加了ApplyConfigurationsFromAssembly扩展方法。您可以按如下方式使用它:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(UserConfiguration).Assembly); // Here UseConfiguration is any IEntityTypeConfiguration
}
Run Code Online (Sandbox Code Playgroud)
谢谢你。
现在已内置到 EF Core 2.2 中:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(PersonConfiguration).Assembly);
}
Run Code Online (Sandbox Code Playgroud)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var implementedConfigTypes = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => !t.IsAbstract
&& !t.IsGenericTypeDefinition
&& t.GetTypeInfo().ImplementedInterfaces.Any(i =>
i.GetTypeInfo().IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>)));
foreach (var configType in implementedConfigTypes)
{
dynamic config = Activator.CreateInstance(configType);
modelBuilder.ApplyConfiguration(config);
}
}
Run Code Online (Sandbox Code Playgroud)