Entity Framework : 如何用相同的对象创建双重关系(1-1 和 many-1)

Entity Framework : how to create double relationship (1-1 and many-1) with same objects

我有两个 class :

class Sub
{
    public Guid Id { get; set; }
    public DateTime ValidDate { get; set; }
    public Guid MasterId { get; set; }
    public Master Master { get; set; }
}

class Master
{
    public Guid Id { get; set; }
    public int Data { get; set; }

    public ICollection<Sub> Subs { get; set; }
    public Sub MainSub { get; set; }
}

简单来说,一个master有一个main sub来定义它,可以有0个或多个"secondary" sub。 我试过用这种方式做映射

var mBuilder = modelBuilder.Entity<Master>();
mBuilder.HasMany(m => m.Subs).WithOne(m => m.Master).HasForeignKey(m => m.MasterId);
mBuilder.HasOne(m => m.MainSub).WithOne(m => m.Master);

但我有一个预期的例外 ("Master cannot participate in two relationships")。我不想更改我的模型,因为它适合我的需要,我该如何执行这样的映射才能做到这一点?

您无法映射此关系。每一种关系都有 2 个端点,您 class 中的一个复杂 属性 不能成为 2 个关系的端点。

我会在我的 Sub [=43= 中创建一个 bool? IsMainSub 属性 ] 并在我的 [=11 中为 MasterIdIsMainSub 创建唯一键约束=]class。这将确保 Master 记录不能有 2 个主要 Sub 记录。

UPDATE - 我知道这看起来并不完美,IsMainSub 属性 只允许值 truenull 因为设置值 false 会触发唯一约束冲突。这是您可以添加到 属性 setter 的逻辑,以获取任何 false 值并将其转换为 null。

据我所知,您可以创建一个唯一键约束,允许某些列的 null 值而不违反约束。我会仔细检查一下。