1

我有两节课:

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” subs。我试过用这种方式映射

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);

但正如预期的那样,我有一个例外(“大师不能参与两个关系”)。我不想更改我的模型,因为它符合我的需要,我该如何执行这样的映射来做到这一点?

4

1 回答 1

1

您无法映射此关系。每个关系都有 2 个端点,并且您的类中的一个复杂属性不能是 2 个关系的端点。

我会bool? IsMainSub在我的班级中创建一个属性,并为我的班级创建Sub一个唯一的键约束。这将确保一个记录不能有 2 个主要记录。MasterIdIsMainSubSubMasterSub

更新- 我知道这看起来并不完美,该IsMainSub属性只允许值true,并且null由于设置值false会触发唯一约束违规。这是您可以添加到属性设置器以获取任何false值并将其转换为 null 的逻辑。

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

于 2016-12-07T15:22:53.860 回答