问题描述
我面临这个问题:
我希望 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; }
}