我有两个类,具有 1 - 1..* 关系。
class A
{
public long Id;
public virtual ICollection<B> Bees;
}
class B
{
public long Id;
public A MyA;
}
现在,我正在尝试让我的数据库运行,以便 A 的任何实例都必须在其 ICollection 中至少有一个 B,没有上限。B 的任何行都应具有对 A 行的外键引用。我的映射如下所示:
public AMapping()
{
this.ToTable("A");
this.HasKey(x => x.Id);
}
public BMapping()
{
this.ToTable("B");
this.HasKey(x => x.Id);
this.HasRequired(x => x.MyA)
.WithMany(x => x.Bees);
}
执行此操作时的预期行为:
var aaaaah = new A();
aaaaah.Bees = null;
MyDbContext.A.Add(a);
应该是引发的异常。但实体框架插入没有任何抱怨。我在映射中做错了什么?
编辑:我通过在Bees属性上放置[System.ComponentModel.DataAnnotations.Required]注释来解决这个问题,从而为该问题做了一个丑陋的临时解决方案。但这只检查 Bees 是否为 null,而不是检查它是否为空列表(如果它被实例化)。
没有真正的本机方法可以使用 EF 或 SQL 来实现此目的,即您无法在没有 B 的情况下创建 A,并且无法在没有 A 的情况下创建 B。僵局。
您需要在业务层中创建一些逻辑来强制实施约束。 例如
class A
{
...
public A(B b)
{
this.Bees = new List<B>();
this.Bees.Add(b);
}
}
class B
{
...
public B(A a)
{
this.MyA = a;
}
}
注意:假设代码优先,如果数据库优先,则在分部类中进行自定义。