SQL播种的实体子项无法被EF Core加载,EF Core插入则正常,如何解决?
SQL脚本播种的EF Core实体无法加载关联子实体
用SQL脚本向SQL Server数据库插入Order实体及其OrderItems子实体后,通过EF Core查询该订单时,OrderItems不会出现在结果中;但如果是用EF Core的API插入相同的订单和订单项,查询时就能正常获取所有关联数据。
示例代码
SQL播种脚本
INSERT INTO Orders (Id, OrderDate) VALUES (1, '2022-01-01'); INSERT INTO OrderItems (Id, OrderId, ProductName, Quantity) VALUES (1, 1, 'Product A', 2); INSERT INTO OrderItems (Id, OrderId, ProductName, Quantity) VALUES (2, 1, 'Product B', 1);
EF Core查询代码
var order = _dbContext.Orders.FirstOrDefault(o => o.Id == 1);
延迟加载配置
已配置基于代理的延迟加载:
options.UseSqlServer(builder.Configuration.GetConnectionString("")) .UseLazyLoadingProxies();
解决办法
验证延迟加载的前提条件
基于代理的延迟加载要求:Order实体类为public且非密封- 导航属性
OrderItems必须标记为virtual
检查实体定义:
public class Order { public int Id { get; set; } public DateTime OrderDate { get; set; } // 必须是virtual才能触发延迟加载 public virtual ICollection<OrderItem> OrderItems { get; set; } }若未满足以上条件,延迟加载不会生效,EF Core不会自动加载子实体。
确保上下文处于活跃状态
延迟加载需要DbContext在访问导航属性时仍处于可用状态。如果查询后上下文已被释放,访问OrderItems会返回空。确保在访问子实体时上下文未被销毁:using(var context = new YourDbContext()) { var order = context.Orders.FirstOrDefault(o => o.Id == 1); // 此时访问OrderItems会触发延迟加载 var items = order.OrderItems; }显式加载关联实体
若不想依赖延迟加载,最可靠的方式是用Include显式加载子实体:var order = _dbContext.Orders .Include(o => o.OrderItems) .FirstOrDefault(o => o.Id == 1);检查外键关联有效性
确认SQL脚本中OrderItems的OrderId与Orders表的Id完全匹配,且数据库中外键约束已正确配置。外键值不匹配会导致EF Core无法关联子实体。
内容的提问来源于stack exchange,提问作者Matteo Catrini
相关产品推荐
相关产品推荐

