2012-08-23 101 views
0

我有一個ASP.NET MVC 4應用程序與EF和我沒有使用CodeFirst。 我希望我的SQL表看起來像這樣:一對零或一個關係ASP.NET MVC

訂單1 ---- 0 ... 1個OrdersWithShipment

CREATE TABLE Orders (
OrderId int NOT NULL IDENTITY(1,1), 
OrderDate date NOT NULL, 
OrderNo int NOT NULL, 
ShipmentId Int NULL 
CONSTRAINT [Orders_PK] PRIMARY KEY CLUSTERED 
(
    [OrderId] ASC 
)) 

CREATE TABLE OrdersWithShipment (
ShipmentId int NOT NULL IDENTITY(1,1), 
OrderId int NULL, 
ShipmentDate date NOT NULL 
CONSTRAINT [OrdersWithShipment_PK] PRIMARY KEY CLUSTERED 
(
[ShipmentId] ASC 
)) 

Q:那我需要做的(在SQL和EF)所以我有1 --- 0 ... 1的關係?

編輯: 我可以使用獨特的過濾指數link

+0

這有什麼好做的ASP.NET MVC。您應該編輯您的主題和標籤,以使其在問題和技術方面更具表現力。 –

+0

你是對的,只有很多對ASP.NET MVC感興趣的人可能會遇到這個問題。 – Misi

回答

2

這是怎麼一個1..0-1可以在SQL中定義(ShipmentId從兩個表中刪除):

CREATE TABLE Orders (
OrderId int NOT NULL IDENTITY(1,1), 
OrderDate date NOT NULL, 
OrderNo int NOT NULL, 
CONSTRAINT [Orders_PK] PRIMARY KEY CLUSTERED 
    ([OrderId] ASC) 
) ; 

CREATE TABLE OrdersWithShipment (
OrderId int NOT NULL, 
ShipmentDate date NOT NULL, 
CONSTRAINT [OrdersWithShipment_PK] 
    PRIMARY KEY CLUSTERED 
    ([OrderId] ASC), 
CONSTRAINT [Orders_OrdersWithShipment_FK] 
    FOREIGN KEY 
    ([OrderId]) 
    REFERENCES [Orders] 
    ([OrderId]) 
) ; 
+0

感謝您提供正確的建議,因爲很多人都在提倡'訂單'表格中的無效FK。 – ErikE

+0

@ErikE thnx。我不確定EF/EF如何處理非身份主鍵。一些框架在每個表中都需要代理鍵。 –

2

EF不支持獨特的按鍵(除了主鍵),這樣你就不會實現這種設置一個一對一的關係。如果你想要一對一的關係,你必須從OrderWithShipment表中刪除OrderId列,並從Orders表中刪除ShipmentId列,並將你的外鍵約束直接放在ShipmentIdOrdersWithShipment表中。這將構建EF的一對一關係,其中Orders是與OrdersWithShipment關聯的主要表格。

+0

這個答案很好,但很混亂,因爲它沒有解釋清楚,通過建議刪除'OrderId',你的意思是'ShipmentID'不再是'identity',並且將取代'OrderID'的合理位置。在我看來,由於沒有其他子類型表也需要它自己的區別名(來自Order),所以最好將它保留爲'OrderID'。 – ErikE