1

我有两个类:实体框架:如何创建具有相同的对象双重关系(1-1和许多-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; } 
} 

简单,高手有一个主要的子集来定义它,并且可以有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); 

但我预期(“主不能参加两个关系”)的异常。我不想改变我的模型,因为它适合我需要的东西,我该如何执行这样的映射?

+0

想想你将如何在SQL中建模。无法用一个FK完成。 –

回答

1

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

我会创造我Subbool? IsMainSub财产并以我Sub类创建MasterIdIsMainSub唯一键约束。这将确保Master记录不能有2个主Sub记录。

UPDATE - 我知道这看起来并不完善,IsMainSub属性将只允许值truenull自整定值false将触发违反唯一约束。这是逻辑,您可以添加到您的属性设置器采取任何false值并将其转换为空。

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

+0

感谢您的回答。实际上,我宁愿让我的MainSub在记忆中保持纯粹的概念,在访问和保存单个关系时从集合中提取它。从数据库的角度来看,我无法断言我有一个mainSub定义,但它足够好。如果我必须实施解决方案,那么您的解决方案似乎是正确的,因此我会将其标记为答案 – cdie

相关问题