实体框架,插入了引用最后一个Id的外键,同时也是同一张表上之前的集合
Posted
技术标签:
【中文标题】实体框架,插入了引用最后一个Id的外键,同时也是同一张表上之前的集合【英文标题】:Entity framework, Foreign Key referencing last Id was inserted, and also a collection of previous ones on the same table 【发布时间】:2021-05-31 00:17:34 【问题描述】:我正面临这个问题:
我希望MallWorker
可以引用最后一个注册的Sell
,但也可以引用之前发生的历史事件。它是同一张表的“2 x 外键”,但我不知道如何配置它,所以它不会抱怨多重。
public class MallWorker
public int Idget;set;
public string WorkerNameget;set;
public int IdLastSellget;set;
public Sell IdLastSellNavigationget;set;
public ICollection<Sell> SellsHistoricalDataget;set;
public class Sell
public int Idget;set;
public string Nameget;set;
public int IdMallWorkerget;set;
public DateTime Dateget;set;
public MallWorker IdMallWorkerNavigationget;set;
如何配置实体框架 6 来处理这种情况?
【问题讨论】:
是 EF6 还是 EF Core? EF6,写在最后一句:) 是的,我看到了。但是您添加了 EF Core 标记。 哦,是的,现在修复了 属性IdLastSellNavigation
是Sell
的类型,但OP 的代码显示了一个类LastShell
。错了吗?
【参考方案1】:
这很好,除非您需要使 IdSell 可以为空,否则您将永远无法插入任何行,因为您有一个必需的循环依赖项,并且 SQL Server 在 INSERT 时检查所有外键。
EG:
public class MallWorker
public int Id get; set;
public string WorkerName get; set;
public int? IdLastSell get; set;
public Sell IdLastSellNavigation get; set;
public ICollection<Sell> SellsHistoricalData get; set;
public class Sell
public int Id get; set;
public string Name get; set;
public int IdMallWorker get; set;
public DateTime Date get; set;
public MallWorker IdMallWorkerNavigation get; set;
因此您可以插入一个 MallWorker,后跟多个 Sell,然后更新 MallWorder 的 IdSell。请注意,您的模型不保证 MallWorker 的 LastSellNavigation 是他们自己的 Sell 实体之一。
所以一个更好的模型可能是:
public class MallWorker
public int Id get; set;
public string WorkerName get; set;
public int? IdLastSale get; set;
[ForeignKey("Id,IdLastSale")]
public MallWorkerSale LastSale get; set;
public ICollection<MallWorkerSale> Sales get; = new HashSet<MallWorkerSale>();
public class MallWorkerSale
[Key, Column(Order = 0)]
public int IdMallWorker get; set;
[Key, Column(Order = 1)]
public int Id get; set;
public string Name get; set;
public DateTime Date get; set;
public MallWorker MallWorker get; set;
【讨论】:
代码优先配置呢?我对如何在 EF6 上配置它感兴趣 按照惯例可以正常工作。无需额外配置。 我收到此错误 => 检测到具有引用完整性约束的循环关系。您能提供代码优先代码吗?以上是关于实体框架,插入了引用最后一个Id的外键,同时也是同一张表上之前的集合的主要内容,如果未能解决你的问题,请参考以下文章
为啥在另一个快照隔离事务中插入具有引用行的外键引用行的行会导致事务挂起?