首页 > 解决方案 > 实体框架Core One to Many不使用集合,有可能吗?

问题描述

我在从代码优先创建数据库中的结构时遇到问题,如下所示:

dbo.Glasses
____________
|Id(PK) | LeftSideId(FK)-Nullable | RightSideId(FK)-Nullable|

dbo.Sides
____________
|Id(PK) | Value|

课程

public class Glass
{
    public int Id {get;set;}
    public int? LeftSideId {get;set;}
    public Side LeftSide {get;set;}
    public int? RightSideId {get;set;}
    public Side RightSide {get;set;}
}

public class Side
{ 
    public int Id {get;set;}
    public string  Value {get;set;}
    public int Glass {get;set;}
    public Glass Glass {get;set;} 

}

我对 Fluent API 的尝试(我必须使用 FluentApi):

modelBuilder.Entity<Side>(entity =>
{
    entity.HasOne(side => side.Glass)
        .WithOne(glass => glass.LeftSide)
        .HasForeignKey<Glass>(glass => glass.LeftSideId)
        .OnDelete(DeleteBehaviour.ClientSetNull);

    entity.HasOne(side => side.Glass)
        .WithOne(glass => glass.RightSide)
        .HasForeignKey<Glass>(glass => glass.RightSideId)
        .OnDelete(DeleteBehaviour.ClientSetNull);
});


有了这个我得到错误: Cannot create a relationship between 'Side.Glass' and 'Glass.RightSide ', because there already is a relationship between 'Side.Glass' and 'Glass.LeftSide '. Navigation properties can only participate in a single relationship.

标签: c#.net-coreentity-framework-coreef-fluent-api

解决方案


不,这是不可能的,如果没有集合,它将是一对一的关系

尝试这个

public class Side
{ 
    public int Id {get;set;}
    public string  Value {get;set;}
  
    public virtual ICollection<Glass> LeftSideGlasses {get;set;} 
    public virtual ICollection<Glass> RightSideGlasses {get;set;} 
}

但如果你还想要一对一

public class Side
{ 
    public int Id {get;set;}
    public string  Value {get;set;}
  
    public virtual Glass LeftSideGlass {get;set;} 
    public virtual Glass RightSideGlass {get;set;} 
}

或者,如果您只使用一个 LeftSideGlass 或 RightSideGlass,那么它可能有意义,而不是 2 个属性,只使用一个。例如,您可以只添加一个布尔标志“IsLeft”。


推荐阅读