Linq2Db批量插入时如何关联导航属性并写入StockId
解决Linq2Db批量插入时缺失StockId字段的问题
问题核心在于你的Stockprice模型仅定义了导航属性Stock,但未显式映射数据库中的StockId外键字段,Linq2Db的BulkCopy无法自动从导航属性中提取外键值并插入。以下是可行的解决方法:
方法一:显式添加StockId外键字段(推荐)
直接在模型中添加与数据库列对应的StockId字段,并关联导航属性,这是最直观且可靠的方式:
修改模型定义
public class Stockprice { [Key] public int Id { get; set; } // 显式添加StockId字段,映射数据库的StockId列 [Column("StockId")] public int StockId { get; set; } [Required] // 配置关联关系,IsBackReference=true表示这是反向关联(从子表到父表) [LinqToDB.Mapping.Association(ThisKey = "StockId", OtherKey = "Id", IsBackReference = true)] public Stock Stock { get; set; } // 其他字段... } public class MinuteStockprice : Stockprice { }
修改插入代码
直接设置StockId字段,无需创建并AttachStock对象:
private async Task SavePrices<T>(List<Quote> quotes) where T : Stockprice, new() { using var context = _factory.CreateDbContext(); var connection = context.CreateLinqToDbConnection(); connection.TraceSwitchConnection.Level = TraceLevel.Verbose; connection.OnTraceConnection = x => Console.WriteLine(x.SqlText); var stocks = new List<T>(); foreach (var quote in quotes) { var price = new T { StockId = _isinToStockId[quote.Isin], Ask = quote.Ask, Bid = quote.Bid, Time = quote.Time }; stocks.Add(price); } await connection.BulkCopyAsync(stocks); }
方法二:通过配置解析导航属性外键值(不推荐)
如果不想修改模型结构,需要确保导航属性的实体被上下文完全跟踪,但BulkCopy作为批量操作,不会像EF那样自动解析导航属性的外键值,稳定性较差。你可以尝试提前将Stock实体纳入上下文跟踪,并配置Linq2Db映射规则,但实际效果远不如显式字段可靠。
内容的提问来源于stack exchange,提问作者tailoxyn
相关产品推荐
相关产品推荐

