2012-07-20 27 views
3

我有兩個表:創建一個有麻煩「零或一個」關係使用實體框架

CREATE TABLE Order (
    orderId INTEGER IDENTITY NOT NULL, 
    PRIMARY KEY (orderId) 
) 

CREATE TABLE OrderAdditionalDetails (
    additionalDetailsId INTEGER IDENTITY NOT NULL, 
    orderId INTEGER NOT NULL, 
    PRIMARY KEY (additionalDetailsId), 
    FOREIGN KEY (orderId) REFERENCES Order(orderId) 
) 

我有一個外鍵(FK_OrderAdditionalDetails_Order)在OrderAdditionalDetails表聲明,對OrderID字段。對OrderAdditionalDetails表中的orderId字段也有一個'唯一'約束。這個想法是每個'訂單'在'OrderAdditionalDetails'表中有零個或一個條目。

這一切都由實體框架模型文件拾取,但是當我嘗試創建導航屬性時,它只能讓我聲明一對多的關係。我得到的錯誤如下:

運行轉換:多重性在'FK_OrderAdditionalDetails_Order'關係中的'OrderAdditionalDetails'中無效。因爲依賴角色屬性不是關鍵屬性,所以依賴角色的多重性的上界必須是*。

我真的不知道這意味着什麼 - 使用谷歌搜索錯誤沒有證明有幫助。任何人都可以闡明我做錯了什麼?

回答

1

您的外鍵必須定義爲UNIQUE才能執行一對零或一對一的關係。

也許嘗試這樣的事:

CREATE TABLE OrderAdditionalDetails (
    additionalDetailsId INTEGER IDENTITY NOT NULL, 
    orderId INTEGER NOT NULL UNIQUE, 
    PRIMARY KEY (additionalDetailsId), 
    FOREIGN KEY (orderId) REFERENCES Order(orderId) 
) 

另請參見:Implementing one-to-zero-or-one relation in SQL Server

+0

我試過這個,在理論上這應該有效,但它沒有...使用EF5(DB首先與模型)和SQLServer 2012 – Rob 2013-11-01 14:10:27

2

在你OrderAdditionalDetails表,刪除additionalDetailsID列,使orderIDCLUSTERED PRIMARY KEY。保留您已有的FOREIGN KEY。這是實施這個的正確方法。

additionalDetailsId列不僅沒有增加任何價值,它通過在表中佔用更多空間使事情變得更糟。 orderID已經足夠了;你不需要第二個人造鑰匙,它是,只不過是orderID的替代品。

0

我試圖將一張表與自己的視圖加上一些其他字段。 (有一個很好的理由,這與答案無關)

什麼導致相同的錯誤是在視圖上有多個關鍵字段。儘管我已經指定了該協會涉及的領域,但它們都希望成爲1對1工作的唯一關鍵領域。

我還將關鍵字段設置爲在視圖中不同,但是我在刪除其他字段的關鍵屬性之前做了這樣的操作,因此它可能會或可能不需要。

相關問題