2014-09-10 41 views
0

真實世界的場景一對一或零關係是契約,抵押貸款等,所有這些都被稱爲在縣登記和記錄的辦公室「樂器」。EF5使用不同的密鑰

我在這種情況下有以下實體。

public class Request 
{ 
    [Key] 
    public int RequestId { get; set; } 

    public virtual RequestInstrument RequestInstrument { get; set; } 
} 

public class RequestInstrument 
{ 
    [Key] 
    public int RequestId { get; set; } 
    //This column is also unique and it is enforced in the database 
    //but it is not the primary key 
    public int InstrumentId { get; set; } 

    public virtual Request Request { get; set; } 
    public virtual Instrument Instrument { get; set; } 
} 

public class Instrument 
{ 
    [Key] 
    public int InstrumentId { get; set; } 

    public virtual RequestInstrument RequestInstrument { get; set; } 
} 

請求是爲儀器。有些樂器在沒有請求的情況下錄製。並非所有請求都會變成記錄的樂器。這就是請求和工具具有獨立主鍵的原因。當請求變成記錄的樂器時,對相關樂器只有一個請求,反之亦然。

盡我可以告訴,EF只支持1〜1..0關係,如果兩個表具有相同的密鑰。如果有這樣的事情,我想這實際上是1..0到1..0的關係。

有沒有辦法拉斷採用獨立的主鍵上面的模型?

+0

所以,如果請求ID是不是主鍵,然後做RequestInstruments有這樣說,請求ID和InstrumentId使其獨特組合鍵? – Gjohn 2014-09-10 20:53:43

+0

你說,「請求是爲了樂器。」如果沒有樂器,請求可以存在嗎?另外,你提到一個「記錄樂器」。那是什麼? – 2014-09-10 20:57:24

+0

在RequestInstruments中,RequestId本身是唯一的。 InstrumentId本身也是獨一無二的。它們本身可以是主鍵。順便說一句,我有這個中間交叉鏈接表的唯一原因是因爲SQL Server不允許在一個唯一的索引中多個空值。 – dalchri 2014-09-11 12:39:09

回答

1

正如你已經發現,實體框架只支持1:共享主鍵1或1至0..1關係。原因是英孚不理解或支持獨特的約束。因此,即使您的數據庫中存在唯一約束,EF也不知道這一點,因此它不能保證RequestInstrument.InstrumentId是唯一的。

如果你需要保持這個數據模型,那麼你可以做的最好的是1對多,在那裏你只是你衆多收藏假設一個項目。這並不理想,但這是實現它的唯一方法。

實體框架6.x確實支持唯一索引,並且有一些關於增強EF模型以利用它來支持1:1的討論,但至今尚未實現。

+0

這個解決方案肯定比在我目前所處的模型中沒有關係更好。 – dalchri 2014-09-11 13:14:21

相關問題