2012-11-03 52 views
1

我首先使用實體​​框架代碼,並且遇到問題,因爲EF使用兩個引用鍵創建Event表,其中一個用於類ObjectOne,另一個用於類ObjectTwo是否可以將多個關係保存在一個表格列中?

是否可以保留一列中的Id值Event.ObjectId以及屬性中的關係類型Event.Type

我可以做以下映射(其中我只有一列FK)。是否有可能在數據庫中沒有創建FK,因爲現在我必須補充存在於ObjectOne表和ObjectTwo表值,它不是爲我一個解決方案):

modelBuilder.Entity<ObjectOne>() 
      .HasMany(c => c.Events).WithOptional().HasForeignKey(x => x.ObjectId); 
     modelBuilder.Entity<ObjectTwo>() 
      .HasMany(c => c.Events).WithOptional().HasForeignKey(x => x.ObjectId); 

樣品類:

public class ObjectOne 
{ 
    public int ObjectOneId { get; set; } 
    public ICollection<Event> Events { get; set; } 
} 

public class ObjectTwo 
{ 
    public int ObjectTwoId { get; set; } 
    public ICollection<Event> Events { get; set; } 
} 


public class Event 
{ 
    public int EventId { get; set; } 
    public int ObjectId { get; set; } 
    public string Type { get; set; } 
} 

public class AddEvent : Event 
{ 
} 

public class Updated : Event 
{ 
} 

在此先感謝

+2

這是一個**可怕的壞主意**有一個引用一次'TableOne'和另一次'TableTwo'的列。不要這樣做。有**兩個單獨的,重點** FK列有什麼問題?這是一個更清潔的設計 - 你可以有**的實際參考完整性**(你不能用另一種方法做的事情)...... –

+0

嘿嘿我知道這看起來很討厭,但我在源頭看到類似的東西一家公司的代碼,他們在nHibernate中完成,我很好奇是否可以使用EF進行配置。我認爲他們使用這種解決方案是因爲他們有一個Event表和大約一百個與此事件表相關的對象,現在您必須選擇100個FK鍵或2個列?老實說,在這種情況下我真的不知道好的解決方案,也許你可以提出一些建議? –

+0

在這種情況下,您需要擁有兩列/屬性,但無法建立任何關係 - 無論是在數據庫級還是在EF中(因爲FK列可引用100個表中的任何一個......) –

回答

3

此類多態關聯通常被視爲反模式,請參閱Bill Karwin的SQL Antipatterns。但是,在某些情況下,他們不可避免地(或者過於實際地不能保持清教徒)。如果您仍然想使用它們,Bill Karwin非常友好,可以推薦一個實現。你應該閱讀這本書的所有細節,但問題的心臟是這樣的圖:

(其中評論有你的事件表的作用,而不是要與事件表圖中的困惑!!)。

在基表中收集與Event關聯的表的所有主鍵。

實體框架的另一種方法是可能的(雖然不是真的和你想以適應表的數量是可行的):你可以在OneEventTwoEvent等,其中Type是鑑別繼承Event,和準ObjectOneOneEvent小號,ObjectTwoTwoEvent s等

+1

好的非常感謝我的問題。我把這本書放在我的列表中;)關於我的問題,我可以做你在圖片中介紹的內容 - >然後我使用Table-Per-Type層次結構,但效率很低(查詢),或者像你用這個子類描述的Event類一樣。 –

+0

+1,因爲我不知道SQL反模式 – jsj

相關問題