首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有Filter Entityframework核心的ApplyConfigurationsFromAssembly

具有Filter Entityframework核心的ApplyConfigurationsFromAssembly
EN

Stack Overflow用户
提问于 2020-04-25 18:49:11
回答 2查看 4.7K关注 0票数 3

我需要使用特定类型的实体创建db上下文,因为解决方案上有多个Db上下文。我的问题是OnModelCreating,我们从程序集builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly())应用配置,所以我想应用配置,只有IEntityTypeConfiguration类型,实体有基本模型BaseEntity,如下所示

代码语言:javascript
运行
复制
public class DaysOfWeekBuilder : IEntityTypeConfiguration<DaysOfWeek>
{
    public void Configure(EntityTypeBuilder<DaysOfWeek> builder)
    {
        builder.ToTable("DaysOfWeek");
        builder.Property(e => e.Name).HasMaxLength(15);
    }
}

所以DaysOfWeek实体有基类BaseEntity

代码语言:javascript
运行
复制
public class DaysOfWeek : BaseEntity
{
    public string Name { get; set; }
}

如何对具有基本模型IEntityTypeConfiguration的实体进行BaseEntity过滤?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-25 19:00:16

文档说,您可以添加一个用于筛选的谓词作为第二个参数。

在这种情况下,谓词将扫描类型,对于每个类型,将检查它是否实现了IEntityTypeConfiguration<T>接口,以及T是否继承了BaseEntity

代码语言:javascript
运行
复制
builder.ApplyConfigurationsFromAssembly(
    Assembly.GetExecutingAssembly(), 
    t => t.GetInterfaces().Any(i => 
                i.IsGenericType &&
                i.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>) &&
                typeof(BaseEntity).IsAssignableFrom(i.GenericTypeArguments[0]))
);
票数 11
EN

Stack Overflow用户

发布于 2022-07-06 07:47:25

我有一个类似的问题,EF迁移会失败,因为我在多个上下文中具有相同的实体。埃米尔的回答肯定对我有帮助。因此,基于@Amir的asnwer,我做了以下几点。

代码语言:javascript
运行
复制
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迁移的迁移之外。

代码语言:javascript
运行
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfigurationsForEntitiesInContext();
    modelBuilder.Entity<SomeEntity().Metadata.SetIsTableExcludedFromMigrations(true);
}

我想,将来我只会为迁移创建单独的DbContexts,并将它们放在自己的程序集中。我不喜欢拥有与这些程序集中的生产无关的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61430833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档