我有两个班,有一个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,如果它是实例化的话,它是否为空列表。
答案 0 :(得分:2)
没有真正的原生方法可以通过EF或SQL实现此目的,即无法在没有 B 的情况下创建 A ,并且没有 A ,您无法创建 B 。僵持。
您需要在业务层中创建一些逻辑来强制执行约束。 E.g。
class A
{
...
public A(B b)
{
this.Bees = new List<B>();
this.Bees.Add(b);
}
}
class B
{
...
public B(A a)
{
this.MyA = a;
}
}
N.B。假设代码优先,如果db-first在部分类中进行自定义。