sql-server - 实体框架关联不会延迟加载特定记录。外键是字符串
问题描述
我有一个实体不会加载关联实体的问题,我认为这是特定于数据的。它大部分时间都有效,但我发现了它失败的例子。我在 SQL 中有一个解决方法,但我想了解它为什么会发生。
我正在使用数据库优先。这是我的模型的简化表示:
public class StockItem
{
public int ItemId { get; set; }
public string CustomerCode { get; set; }
public virtual Address Customer { get; set; }
}
public class Address
{
public string CustomerCode { get; set; }
public string CustomerName { get; set; }
}
在 SQL 数据库中,CustomerCode 上有一个外键。但是,地址中的主键是字符串,而不是整数。不确定这是否是问题所在。
这是一个非常简单的代码片段:
int id = 1;
StockItem stock = context.StockItems.Find(id);
if (stock.Customer == null && stock.CustomerCode != null) stock.Customer = context.Address.FirstOrDefault(a => a.CustomerCode == stock.CustomerCode);
永远不需要最后一行,而且大多数情况下不需要。但是对于一些记录,我需要添加此代码来检索地址。
我相信这是一个 SQL 问题,因为我可以使用从地址中选择 CustomerCode 并使用该值更新 StockItems 中的 CustomerCode 的 SQL 查询来解决此问题。一旦我在数据库中完成了该操作,代码就可以正常工作。我确实尝试删除并重新创建外键,但这并没有解决它。
我知道这表明 CustomerCodes 在我更新之前有所不同,但如果是这种情况,为什么上面的最后一行有效?我还测试了在表之间使用 Join 运行 SQL 查询并且该查询有效,因此值必须匹配。
知道为什么,当两个表中的 CustomerCode 值匹配时, StockItem.Customer 实体将为空,但在使用 StockItem.CustomerCode 作为键值以直接从 Address 表中检索时可以检索到。
最后,考虑一下,我不确定这是一个延迟加载问题,因为我在检索 StockItem 时也尝试使用 .include("Address") 并且没有任何区别。
* 编辑 *
我找到了。Address 表中的 CustomerCode 值已从“Customer Uk”修改为“Customer UK”(大写 K)。由于与其他外键冲突,更新级联关闭。所以 SQL 连接和 EF Select 是不区分大小写的,而 EF 关联加载必须区分大小写。
有没有办法在 EF 中覆盖它?