实体框架一要求许多映射不起作用

时间:2016-02-18 08:32:39

标签: c# entity-framework-6 entity-framework-mapping

我有两个班,有一个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,如果它是实例化的话,它是否为空列表。

1 个答案:

答案 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在部分类中进行自定义。