簡體   English   中英

EF:使用流暢的 API 映射基類屬性

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

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