2

我有两个班级,有 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 是否为空,而不是实例化时是否为空列表。

4

1 回答 1

2

没有真正的本地方法可以使用 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;
    }
}

注意假设代码优先,如果 db-first 在部分类中进行自定义。

于 2016-02-18T10:26:13.440 回答