2017-01-06 202 views
0

我們正在構建具有多個實體的上下文。所有實體都建立在帶有ID(guid)的抽象類上。實體框架 - 多個實體的虛擬表(代碼優先)

我們希望所有實體都與公共日誌表有關係,但無法讓EFCF瞭解由於命名而產生的關係。

public class Log { 
    public BaseEntity Entity {get;set;} 
    public Guid EntityID {get;set;} 
} 

public class Example : BaseEntity { 
    public virtual ICollection<Log> Logs {get;set;} 
} 

任何人都可以幫助一個模式,支持?我們已經嘗試過抽象,設置OnModelCreating等,但由於沒有支持的命名,所以一直出現模糊錯誤。如果我們添加這些;

[ForeignKey("EntityID")] 
public Example Example {get;set;} 
[ForeignKey("EntityID")] 
public Example5 Example5 {get;set;} 
[ForeignKey("EntityID")] 
public Example2 Example2 {get;set;} 

在Log類上的一組屬性,一切工作正常。添加新的日誌條目時發生問題。

+0

當你創建日誌時你會做什麼?你有沒有嘗試將它作爲BaseEntity進行投射?也許是一個類型值,所以你可以手動重鑄回你的類型? – MiltoxBeyond

+0

或者你可以讓它只是一個基於GUID的getter? – MiltoxBeyond

+0

邏輯思考。你可以在關係數據庫中創建這樣的FK嗎? –

回答

0

我會提出一個可行的解決方案,將通用字段抽象爲一個基類。

在模型構建使用MapInheritedProperties()(跟着)

modelBuilder.Entity<Models.Example>().Map(x => x.MapInheritedProperties()); 

modelBuilder.Entity<Models.Log>() 
    .HasRequired(x => x.BaseEntity) 
    .WithMany(x => x.Logs) 
    .Map(x => 
    { 
     x.ToTable("Example"); 
     x.MapKey(new[] { "ID" }); 
    }) 
    .WillCascadeOnDelete(false); 

我現在可以分配「虛擬」表的任何實體,只要他們從基類派生。