簡體   English   中英

ApplyConfigurationsFromAssembly 與過濾器實體框架核心

[英]ApplyConfigurationsFromAssembly With Filter Entityframework Core

我需要使用特定類型的實體創建數據庫上下文,因為我在解決方案上有多個數據庫上下文。 我的問題是OnModelCreating我們從程序集生成器應用配置。ApplyConfigurationsFromAssembly builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly())所以我想應用配置只有IEntityTypeConfiguration類型的實體具有基本 model BaseEntity如下

public class DaysOfWeekBuilder : IEntityTypeConfiguration<DaysOfWeek>
{
    public void Configure(EntityTypeBuilder<DaysOfWeek> builder)
    {
        builder.ToTable("DaysOfWeek");
        builder.Property(e => e.Name).HasMaxLength(15);
    }
}

所以DaysOfWeek實體有基礎 class BaseEntity

public class DaysOfWeek : BaseEntity
{
    public string Name { get; set; }
}

我們如何過濾IEntityTypeConfiguration具有基礎的實體 model BaseEntity

謝謝

文檔說您可以添加一個用於過濾的謂詞作為第二個參數。

在這種情況下,謂詞將掃描類型,並且對於每種類型,將檢查它是否實現了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]))
);

我有一個類似的問題,即 EF 遷移會失敗,因為我在多個上下文中擁有相同的實體。 阿米爾的回答肯定對我有幫助。 因此,基於@Amir's 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]))
        );
}

這樣做的重點是它查看當前 dbcontext 中的所有實體,並且只在 DbContext 中添加 DbSet 的配置。

這解決了我在同一個程序集中有多個 DbContext 並使用modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());

如果您在一個程序集中有多個上下文,則使用ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly())尤其糟糕 - 它還可以使初始 model 的創建在啟動時非常慢。 原因是它將所有配置添加到 DbContext 中,而不管它是否具有與配置對應的 DbSet。 只要它在同一個程序集中,它就會被添加。

解決我的問題的下一步是從遷移中排除已經從其他 DbContext 遷移的 DbSet。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfigurationsForEntitiesInContext();
    modelBuilder.Entity<SomeEntity().Metadata.SetIsTableExcludedFromMigrations(true);
}

我認為將來我將專門為遷移創建單獨的 DbContext,並將它們放在自己的程序集中。 我不喜歡在這些程序集中使用與生產無關的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM