使用Entity Framework创建一个“零或一个”关系时遇到问题

时间:2012-07-20 20:51:35

标签: c# .net entity-framework

我有两张桌子:

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)
)

我在orderIditionalDetails表上的orderId字段上声明了一个外键(FK_OrderAdditionalDetails_Order)。我对OrderAdditionalDetails表中的orderId字段也有一个“唯一”约束。我们的想法是每个'订单'在'OrderAdditionalDetails'表中都有零个或一个条目。

这一切都被实体框架模型文件所取代,但是当我尝试创建Navigation属性时,它只允许我声明1对多的关系。我得到的错误如下:

运行转换:在关系'FK_OrderAdditionalDetails_Order'中的角色'OrderAdditionalDetails'中,多重性无效。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为*。

我真的不确定这意味着什么 - 谷歌搜索错误并不是很有帮助。有人能说清楚我做错了吗?

3 个答案:

答案 0 :(得分:2)

OrderAdditionalDetails表格中,移除additionalDetailsID列并将orderID设为CLUSTERED PRIMARY KEY。保留您已有的FOREIGN KEY。这是实现这一目标的正确方法。

additionalDetailsId列不仅没有添加任何值,而且通过占用表格中的更多空间会使事情变得更糟。 orderID已经足够了;你不需要只是orderID 的代理人的辅助人工密钥。

答案 1 :(得分: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

答案 2 :(得分:0)

我试图将一个表与自己的视图以及其他一些字段相关联。 (这有一个非常好的理由与答案无关)

导致相同错误的原因是视图上有多个关键字段。尽管我已经指定了关联中涉及的字段,但它希望它们都是1到1工作的唯一关键字段。

我还在视图中将关键字段设置为Distinct,但是在删除其他字段的key属性之前我已经这样做了,所以它可能是,也可能不是。