2017-01-23 77 views
0

我首先遇到繼承代碼問題。 我有基類,它是這樣的:EF:使用流暢的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'。「如何避免定義密鑰並只改變屬性映射?我有派生類的關鍵。

+0

因此,你想爲每個派生類定義單個的鍵,並使用「每個具體類的表」策略?然後,您應該在派生類實體上配置基類屬性。 – grek40

+0

如果我理解正確,你沒有使用** EF繼承**,但簡單的C#類繼承? –

+0

是的,但我有很多派生類來一一配置它。這將會產生許多複製粘貼代碼,我不想要它。它的更好的解決方案?是的,我有C#類繼承,我嘗試獲得乾淨的模型,並獲得一切流利的API。 – CrazyBaran

回答

1

你可以將你的基類配置包裝在一個通用的方法中,併爲每個具體的實體類型調用它。

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中。但是,如果它是我的代碼,我更願意爲每個實體類編寫一行代碼,而不是用於動態發現。

+0

如果我有很多DerivedEntity,這個答案會產生如此多的複製粘貼代碼,也許是一些更乾淨的方法來做到這一點? – CrazyBaran

+0

@CrazyBaran如果每個具體類的單線程對於您的情況非常重要,請隨意使用反射或MEF之類的東西來收集派生類集合並創建我的代碼的基於反射的版本。 – grek40

+0

@CrazyBaran看到我的編輯,也許這就是你需要的 – grek40

相關問題