父子一对一关系相同的表

我有一个关于如何在Microsoft SQL-Server 2012中实现表关系的问题。

我有一个表(MyTable),它应该包含父/子结构。 一个父母可能有一个孩子,一个孩子只有一个父母。 这是一种经典的一对一关系。 最顶层的条目显然可能没有父级。 (这是通过可空的属性建模的)

当我尝试在MS-SQL中对此进行建模时,我收到如下表。

从EntityFramework生成

这是我的代码:

CREATE TABLE [dbo].[MyTable]( [Id] [uniqueidentifier] PRIMARY KEY NOT NULL, [Name] [nvarchar](200) NOT NULL, [ParentObjectId] [uniqueidentifier] NULL ) GO ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [FK_MyTable_ParentObject] FOREIGN KEY([ParentObjectId]) REFERENCES [dbo].[MyTable] ([Id]) GO ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [Unique_ParentId] UNIQUE(ParentObjectId) GO ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_ParentObject] GO 

UNIQE约束应确保一个孩子最多只有一个父母。

但entity framework不允许我将属性更改为一对一关系。 它总是产生一对多的关系。

编辑 :代码是DB-First。

您是否知道如何在MS-SQL和EntityFramework中正确建模?

不幸的是,你无法在EF中做你想做的事。

当存在共享主键时,EF仅支持一对一映射(即,两个表必须具有相同的主键,并且一个必须是另一个的外键)。 出于显而易见的原因,在使用自引用表时无法执行此操作。

EF不支持这一点的原因是EF不支持唯一约束,因此它无法确保约束1:1映射。 这可能会改变,因为EF现在支持唯一索引,但这并没有改变对一对一共享主键的要求。

你能做的最好的事就是创造一对多。

您应该首先创建父表,然后将子表与之关联,如下所示

父表/汽车/ CarID /颜色/

儿童表/制作/ MakeID /制作/ CarID /

如果你以这种方式联系它,你将实现父母和孩子之间的正确关系