我有一个关于如何在Microsoft SQL-Server 2012中实现表关系的问题。
我有一个表(MyTable),它应该包含父/子结构。 一个父母可能有一个孩子,一个孩子只有一个父母。这是一种经典的一对一关系。最顶层的条目显然可能没有父级。 (这是通过可以为空的属性建模的)
当我尝试在MS-SQL中对此进行建模时,我会收到如下表格。
这是我的代码:
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中正确建模?
答案 0 :(得分:4)
不幸的是,你不能在EF中做你想做的事。
当存在共享主键时,EF仅支持一对一映射(即两个表必须具有相同的主键,并且一个必须是另一个的外键)。出于显而易见的原因,使用自引用表时无法执行此操作。
EF不支持这一点的原因是EF不支持唯一约束,因此它无法确保约束1:1映射。这可能会改变,因为EF现在支持唯一索引,但这并没有改变对一对一共享主键的要求。
你能做的最好的事就是创造一对一。
答案 1 :(得分:-2)
您应首先创建父表,然后将子表与之关联,如此
父表/ 汽车/ CarID / 颜色/
儿童表/ 使/ MakeID / 使/ CarID /
如果您以这种方式联系它,您将实现父母与子女之间的正确关系