![](/img/trans.png)
[英]the correct way to map identity base class with fluent api in ef core?
[英]EF: Map base class property with fluent API
我首先遇到繼承代碼的問題。 我有看起來像這樣的基類:
public abstract class BaseEntity
{
public DateTime? DateCreated { get; set; }
public string UserCreatedId { get; set; }
public DateTime? DateModified { get; set; }
public string UserModifiedId { get; set; }
public virtual UserState UserCreated { get; set; }
public virtual UserState UserModified { get; set; }
}
我繼承了它,這給了我一個名為 UserCreated_userStateId 和 UserModified_UserStateId 的附加列。 所以我嘗試像這樣流暢的 API:
modelBuilder.Entity<BaseEntity>().HasOptional(x => x.UserCreated).WithMany().HasForeignKey(x => x.UserCreatedId);
modelBuilder.Entity<BaseEntity>().HasOptional(X => X.UserModified).WithMany().HasForeignKey(x => x.UserModifiedId);
但這給了我錯誤:“在模型生成過程中檢測到一個或多個驗證錯誤:
BaseEntity:: EntityType 'BaseEntity' 沒有定義鍵。 定義此 EntityType 的鍵。 BaseEntities: EntityType: EntitySet 'BaseEntities' 基於未定義鍵的類型 'BaseEntity'。” 如何避免定義鍵而只更改屬性的映射?我在派生類中有鍵。
您可以將基類配置包裝在通用方法中,並為每個具體實體類型調用它。
static void ConfigureBaseEntity<TDerived>(EntityTypeConfiguration<TDerived> entityTypeConfiguration) where TDerived : BaseEntity
{
// your base class configuration
entityTypeConfiguration.HasOptional(x => x.UserCreated).WithMany().HasForeignKey(x => x.UserCreatedId);
entityTypeConfiguration.HasOptional(X => X.UserModified).WithMany().HasForeignKey(x => x.UserModifiedId);
}
調用每個具體實體類型
public class DerivedEntity : BaseEntity
{
public int Id { get; set; }
}
//...
ConfigureBaseEntity(modelBuilder.Entity<DerivedEntity>());
編輯
也許Types
配置足以滿足您的目的。
modelBuilder.Types<BaseEntity>().Configure(entityTypeConfiguration => /* configure using entityTypeConfiguration */);
否則,正如評論的那樣,您可能需要反思。 例如,假設您的所有派生類與BaseEntity
類在同一個程序集中,並且上面的ConfigureBaseEntity
方法在BaseEntityConfiguration
類中。
var entityMethod = typeof(DbModelBuilder).GetMethod("Entity");
var configurationMethod = typeof(BaseEntityConfiguration).GetMethod("ConfigureBaseEntity");
foreach (Type t in typeof(BaseEntity).Assembly.GetTypes().Where(x => x.IsSubclassOf(typeof(BaseEntity))))
{
var configurator = entityMethod.MakeGenericMethod(t).Invoke(modelBuilder, new object[0]);
configurationMethod.MakeGenericMethod(t).Invoke(null, new object[1] { configurator });
}
但是,如果是我的代碼,我寧願為每個實體類編寫一行代碼,而不是進行動態發現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.