父子一对一关系相同的表

时间:2014-06-17 11:05:45

标签: c# sql sql-server entity-framework linq-to-sql

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

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

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

Generated From 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约束应确保一个孩子最多只有一个父母。

但实体框架不允许我将属性更改为一对一关系。它总是产生一对多的关系。

修改: 代码是DB-First。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:-2)

您应首先创建父表,然后将子表与之关联,如此

父表/ 汽车/ CarID / 颜色/

儿童表/ 使/ MakeID / 使/ CarID /

如果您以这种方式联系它,您将实现父母与子女之间的正确关系