[英]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.