实体框架,插入了引用最后一个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 标记。 哦,是的,现在修复了 属性IdLastSellNavigationSell 的类型,但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的外键,同时也是同一张表上之前的集合的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架,如何在两个模型上添加外键以相互引用

Hibernate查询带有ID的外键字段

实体框架添加重复的外键

为啥在另一个快照隔离事务中插入具有引用行的外键引用行的行会导致事务挂起?

如何将项目添加到具有Android Room中父实体的外键引用的子实体?

如何从使用实体框架的外键链接的多个表中获取所有数据?