EF6数据库首先映射一对一的关系

时间:2016-05-09 14:13:43

标签: entity-framework-6 edmx ef-database-first

在我的数据库中,我通过在外键表上建立唯一约束来强制执行一对一关系。这被Sql Server Management Studio正确识别为一对一关系:

enter image description here

我的问题是EF6没有将此标识为一对一关系,并在Person类上生成一个Collection:

enter image description here

如果t4模板中的itemCollection包含唯一的密钥信息,我可以很容易地修改T4模板,以便在表上有唯一键时不生成集合。但它们只包含外键信息。我想这是因为edmgen工具不会从db中提取这些信息。

有没有办法强制该工具在数据库中包含所有约束,以便我可以在t4模板中使用这些信息?

3 个答案:

答案 0 :(得分:1)

我认为这里最好的解决方案是重新考虑你的表格和关系。

选项1 : 如果这是一对一的关系,你可以将所有内容放在一个表中吗?

选项2 : 取出PersonId列。如果这真的是1比1,甚至是" 1到0或1"关系,表应该共享一个主键。关系应该在Id和Id之间。如果这样做,EF6将正确识别它。

答案 1 :(得分:1)

选项 3:在外键上放置唯一约束或唯一索引。

外键的唯一性将关系的那一侧的基数限制为最多 1。我测试并确认在数据库优先场景中使用 Sql Server 和 EF Core 5.0 时,这是正确的脚手架。

为什么选择 3 可能更好

选项 3 适用于 1-to-0..1 和 0..1-to-0..1 关系。这意味着您可以很容易地在现有数据库上使用它,而无需更改它们。

0..1 到 0..1 的关系确实很自然地发生,当实体在链接之前可以独立存在时。扩展上面的示例,如果我们允许与任何人无关的系统用户帐户,并且我们还有尚未为其创建用户帐户的人,那么最好通过 0..1-to 建模-0..1 关系。

如果您确定需要 1 对 0..1 的关系,则选项 2 仍然是一个不错的选择。您可以稍后再迁移到选项 3,但它会做更多工作。

附加说明

如果您要实现 [0,1]-to-[0,1] 关系,那么您的外键字段将为空。可空外键上的 UNIQUE 约束通常允许多行包含 NULL,因为 NULL 不是传统 SQL 中的值。但是,Sql Server 是一个例外,它只允许一行在外键中保存 NULL。

解决方案是在 Sql Server 上使用有条件的 UNIQUE INDEX 而不是 UNIQUE CONSTRAINT。您的条件应仅将索引应用于外键中具有非空值的行。

您可以使用 SQL 创建这样的索引,如下所示。

CREATE UNIQUE INDEX IX_User_Person
ON User (PersonId) WHERE PersonId IS NOT NULL;

答案 2 :(得分:0)

听听。你是对的。我有同样的问题。在一列上使用主键和外键。不要将主键和外键分成两列。这肯定会解决你的问题