Database 实体框架:如何创建具有相同对象的双重关系(1-1和多-1)

Database 实体框架:如何创建具有相同对象的双重关系(1-1和多-1),database,entity-framework,mapping,relationships,fluent-entity-framework,Database,Entity Framework,Mapping,Relationships,Fluent Entity Framework,我有两门课: class Sub { public Guid Id { get; set; } public DateTime ValidDate { get; set; } public Guid MasterId { get; set; } public Master Master { get; set; } } 及 类主控 { 公共Guid Id{get;set;} 公共int数据{get;set;} 公共ICollection Subs{get;set;

我有两门课:

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

类主控
{
公共Guid Id{get;set;}
公共int数据{get;set;}
公共ICollection Subs{get;set;}
公共子MainSub{get;set;}
}
简单地说,一个主节点有一个主节点来定义它,并且可以有0个或更多的“辅助”节点。 我试着用这种方法做映射

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);
var mBuilder=modelBuilder.Entity();
mBuilder.HasMany(m=>m.Subs)。with one(m=>m.Master)。HasForeignKey(m=>m.MasterId);
mBuilder.HasOne(m=>m.MainSub)。WithOne(m=>m.Master);

但我有一个例外(“主人不能参与两种关系”)。我不想更改我的模型,因为它符合我的需要,我如何执行这样的映射才能做到这一点?

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

我会创建一个
bool?IsMainSub
属性,并为我的
Sub
类中的
主ID
IsMainSub
创建唯一的键约束。这将确保主记录不能有两个主记录

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


我记得,您可以创建一个唯一的键约束,允许某些列使用
null
值,而不违反该约束。我会仔细检查这一点。

想想如何在SQL中对此进行建模。一个FK做不到。谢谢你的回答。事实上,我宁愿让MainSub保持一个纯粹的内存概念,在访问时从集合中提取它,并保持一个单一的关系。从db的角度来看,我不能断言我定义了一个mainSub,但这已经足够了。如果我必须实现这个解决方案,那么您的解决方案似乎是正确的,所以我将它标记为答案
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);