实体框架,插入了引用最后一个 Id 的外键,以及同一张表上以前的集合

问题描述

我面临这个问题: 我希望 MallWorker 能够引用上次注册Sell,但也要引用之前发生的历史事件。它是同一个表的“2 x 外键”,但我不知道如何配置它,因此它不会抱怨多重。

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;}
}

如何配置实体框架 6 来处理这种情况?

解决方法

这很好,除非您需要将 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; }
}