c# - 实体框架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.
解决方案
不,这是不可能的,如果没有集合,它将是一对一的关系
尝试这个
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”。
推荐阅读
- c - 如何在不使用任何标准随机函数(如 fe rand())的情况下在 C 中创建随机整数?
- vue.js - 具有实时变化的 VueJs Wall
- javascript - 仅在客户端 JS 中检查数据后才调用 Ajax?
- java - testHarness ListState TTL 未在 Flink 1.8.2 上应用
- javascript - 手风琴在产品选项卡下的 Magento2 中不起作用
- c++ - 24 和 124 的空白消除
- ios - 发射不适用于 iOS swift 中的网络套接字?
- clojurescript - Clojurscript:扩展一个 Javascript 类
- vba - 更新后如何使用来自两个组合框的 dlookup 填充文本框
- julia - 在 Julia 中模仿 Scala Option[T] 的最佳方式?