【问题标题】:Parent-Child one-to-one Relation same Table亲子一对一关系同表
【发布时间】:2014-06-17 11:05:44
【问题描述】:

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

我有一个应该包含父/子结构的表 (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 中正确建模有任何想法吗?

【问题讨论】:

  • 你能告诉你 EF 定义/实体吗?
  • 根据定义,您是指生成的代码,还是 VisualStudio 中包含属性(.edmx-File)的可视化表示?
  • 哦 - DB-first。我假设代码优先。抱歉,DB-first 帮不上忙 - 我对 *.edmx 文件过敏...
  • 呵呵,好的。无论如何,谢谢你的时间.. :)
  • 这是真的,但是在代码中选择 .Child 而不是 .Childs.FirstOrDefault() 并检查其值是否为 null 会更方便,...如果没有办法,我会像这样做。 :) --> 在 Tanner 建议在代码中处理这个并且不需要 EF 映射它之后输入。 (评论被删除了?)

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


【解决方案1】:

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

EF 仅在存在共享主键时才支持一对一映射(即两个表必须具有相同的主键,并且一个必须是另一个的外键)。出于显而易见的原因,在使用自引用表时不能这样做。

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

您能做的最好的事情就是创建一对多。

【讨论】:

  • 很好的信息性答案,谢谢..我最终得到了你建议的一对多关系..
  • +1 这是我看到的关于这个问题的唯一真正答案。 EF一直让我失望...
  • @Daniel - EF 现在由社区维护,但仍由 MS 员工管理。如果此功能对您很重要,我建议您访问 codeplex 站点并参与其中。我相信这有一个未解决的问题......
【解决方案2】:

您应该先创建父表,然后将子表与该表关联起来,就像这样

父表/ 汽车/ 车牌/ 颜色/

子表/ 制作/ 制作ID/ 制作/ 车牌/

如果你以这种方式联系起来,你将在父母和孩子之间建立正确的关系

【讨论】:

  • 我知道你的意思,但这不是我的意图。我能够在 DB sie 中对表进行建模,但不是 EF 无法正确显示它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多