【发布时间】:2021-09-25 21:11:36
【问题描述】:
考虑以下两个实体*:
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Child PrimaryChild { get; set; }
public virtual Child SecondaryChild { get; set; }
}
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
// Foreign keys to be added here or
// in the other class (that's what I'm trying to figure out)
}
如代码所示,父母需要有一个主要孩子和一个次要孩子;并且(最好)当父级被删除时,两个子级也应该被删除。
甚至可以用EF表示这种关系吗?
如果父母只有一个孩子,我可以通过将Child 的主键转换为 PK 和 FK 来轻松使用一对一关系 (1 to 0..1)。显然,这不适用于当前的情况,因为一个主键不能有多个值。
感觉这是一种足够普遍的情况,它应该有一个众所周知的解决方案。但是,查了无数个帖子,还是没有找到。我能找到的最接近的东西是this answer,但它不起作用,因为:
-
它创建
* to 0..1关系。 -
当我忽略这个事实并尝试执行以下代码时:
var c1 = new Child { Name = "C1" }; var c2 = new Child { Name = "C2" }; context.Parents.Add(new Parent { Name = "P1", PrimaryChild = c1, SecondaryChild = c2 });...它抛出了一个带有消息的 DbUpdateException:
无法确定相关操作的有效顺序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。
如何解决这个问题?
*这是一个简化的例子。在现实生活场景中,父实体和其他子实体之间存在关系,每个子实体有两个或多个引用。
【问题讨论】:
-
我想知道您真正需要这种关系的商业案例是什么。我肯定会选择关系 1 to Many,因为它提供了进行不同收集操作的机会。如果你真的想将孩子的数量限制为 2,我会添加约束或一些验证逻辑
-
@RedgoodBreaker 谢谢。是的,我认为你是对的。我想得越多,我就越相信一对多(与一群孩子)是要走的路。
标签: c# .net sql-server entity-framework entity-framework-6