EF Core 8:如何通过特性指定Stock.StockTransactions的关联关系?
解决EF Core 8中无法识别导航属性关系的问题
当使用EF Core 8时,会抛出错误:The exception 'Unable to determine the relationship represented by navigation 'Stock.StockTransactions',原因是StockTransaction类包含多个指向Stock的导航属性(Stock、StockFrom、StockTo),EF无法自动推断Stock.StockTransactions对应的外键关系。
要解决这个问题,只需用DataAnnotations特性明确指定双向关系的关联项即可:
修改后的实体类代码
public class Stock { public int StockId { get; set; } // 其他属性省略... [InverseProperty(nameof(StockTransaction.Stock))] public virtual List<StockTransaction> StockTransactions { get; set; } = new(); } public class StockTransaction { public int StockTransactionId { get; set; } // 其他属性省略... public int StockId { get; set; } public virtual Stock Stock { get; set; } public int? StockFromId { get; set; } public virtual Stock? StockFrom { get; set; } public int? StockToId { get; set; } public virtual Stock? StockTo { get; set; } }
说明
[InverseProperty]特性的作用是明确指定当前导航属性对应的反向导航属性。这里我们告诉EF:Stock.StockTransactions集合对应的是StockTransaction中的Stock属性,也就是关联到StockId外键,这样EF就能正确识别这个一对多关系。
如果需要完整映射库存转移的来源和去向关系,还可以在Stock类中添加对应的集合属性:
public class Stock { public int StockId { get; set; } // 其他属性省略... [InverseProperty(nameof(StockTransaction.Stock))] public virtual List<StockTransaction> StockTransactions { get; set; } = new(); // 记录从当前库存转出的交易 [InverseProperty(nameof(StockTransaction.StockFrom))] public virtual List<StockTransaction> OutgoingTransactions { get; set; } = new(); // 记录转入当前库存的交易 [InverseProperty(nameof(StockTransaction.StockTo))] public virtual List<StockTransaction> IncomingTransactions { get; set; } = new(); }
这样EF就能同时识别三个独立的一对多关系,分别对应StockId、StockFromId、StockToId三个外键。
内容的提问来源于stack exchange,提问作者JamesWilliams
相关产品推荐
相关产品推荐

