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

本文关键字:许多 映射 不起作用 框架 实体 | 更新日期: 2023-09-27 18:35:20

我有两个类,具有 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;
    }
}

注意:假设代码优先,如果数据库优先,则在分部类中进行自定义。