首页 > 解决方案 > 实体框架关联不会延迟加载特定记录。外键是字符串

问题描述

我有一个实体不会加载关联实体的问题,我认为这是特定于数据的。它大部分时间都有效,但我发现了它失败的例子。我在 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 中覆盖它?

标签: sql-serverentity-framework

解决方案


推荐阅读