我需要使用特定类型的实体创建db上下文,因为解决方案上有多个Db上下文。我的问题是OnModelCreating
,我们从程序集builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly())
应用配置,所以我想应用配置,只有IEntityTypeConfiguration
类型,实体有基本模型BaseEntity
,如下所示
public class DaysOfWeekBuilder : IEntityTypeConfiguration<DaysOfWeek>
{
public void Configure(EntityTypeBuilder<DaysOfWeek> builder)
{
builder.ToTable("DaysOfWeek");
builder.Property(e => e.Name).HasMaxLength(15);
}
}
所以DaysOfWeek
实体有基类BaseEntity
public class DaysOfWeek : BaseEntity
{
public string Name { get; set; }
}
如何对具有基本模型IEntityTypeConfiguration
的实体进行BaseEntity
过滤?
谢谢
发布于 2020-04-25 11:00:16
文档说,您可以添加一个用于筛选的谓词作为第二个参数。
在这种情况下,谓词将扫描类型,对于每个类型,将检查它是否实现了IEntityTypeConfiguration<T>
接口,以及T是否继承了BaseEntity
。
builder.ApplyConfigurationsFromAssembly(
Assembly.GetExecutingAssembly(),
t => t.GetInterfaces().Any(i =>
i.IsGenericType &&
i.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>) &&
typeof(BaseEntity).IsAssignableFrom(i.GenericTypeArguments[0]))
);
发布于 2022-07-05 23:47:25
我有一个类似的问题,EF迁移会失败,因为我在多个上下文中具有相同的实体。埃米尔的回答肯定对我有帮助。因此,基于@Amir的asnwer,我做了以下几点。
public static void ApplyConfigurationsForEntitiesInContext(this ModelBuilder modelBuilder)
{
var types = modelBuilder.Model.GetEntityTypes().Select(t => t.ClrType).ToHashSet();
modelBuilder.ApplyConfigurationsFromAssembly(
Assembly.GetExecutingAssembly(),
t => t.GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>)
&& types.Contains(i.GenericTypeArguments[0]))
);
}
这样做的要点是,它查看当前db上下文中的所有实体,并且只在DbContext中添加dbcontext的配置。
这解决了在同一个程序集中有多个DbContexts并使用modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
添加配置的问题。
如果一个程序集中有多个上下文,那么使用ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly())
尤其不好--它还会使初始模型的创建在启动时变得非常缓慢。原因是它将所有配置添加到DbContext it中,而不管它是否具有与配置相对应的DbSet。只要它在同一个程序集中,它就会被添加。
解决我的问题的下一步是将DbSets排除在已经从其他DbContexts迁移的迁移之外。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsForEntitiesInContext();
modelBuilder.Entity<SomeEntity().Metadata.SetIsTableExcludedFromMigrations(true);
}
我想,将来我只会为迁移创建单独的DbContexts,并将它们放在自己的程序集中。我不喜欢拥有与这些程序集中的生产无关的代码。
https://stackoverflow.com/questions/61430833
复制