【问题标题】:What can I use instead of an Include?我可以使用什么来代替包含?
【发布时间】:2013-11-19 09:59:46
【问题描述】:

除了使用Include 来急切加载实体之外,还有其他方法吗?

我不能使用 Include 的原因是它似乎区分大小写。
考虑以下示例:
我有两张桌子:

注意大小写的区别。

当我想急切加载SagerStamkartotek 时,我使用Include,但Include 不加载Stamkartotek

** 更新 1 **

我注意到这种奇怪的行为 - 如果我使用来自Stamkartotek 的任何字段,它会正确连接:

但如果我只检索 Stam_nr 的值而不是整个对象 - 它会给我 A 而不是 a

迄今为止的研究:

  • EF 团队 knows 关于此问题 - 但已决定不解决此问题。
  • This guy 仅使用代码优先也有同样的问题 - 没有找到解决方案

更新 2
使用Include 生成的SQL:

FROM  [dbo].[Sager] AS [Extent1]
INNER JOIN [dbo].[Stamkartotek] AS [Extent2] ON [Extent1].[Klient_Stam_nr] = [Extent2].[Stam_nr]
WHERE 'jek15' = [Extent1].[Sags_nr]

更新 3
将它们加载到单独的查询中,并让 changetracker 修复引用。它似乎也不起作用:

【问题讨论】:

  • MSDN 论坛帖子已过时。您是否检查过他们是否在更高版本的 EF 中修复了它?如果有,您应该将您的 EF 版本升级到可以解决问题的版本。不要期望将修复程序向后移植到以前的 EF 版本,尤其是 4.1 之前的版本
  • @PanagiotisKanavos 我尝试使用EF 6.0.1 构建我的模型,但问题仍然存在:|
  • 那么您可能应该将用于关系的列替换为整数。问题不在Include 中,而是在关联使用文本字段时的 SQL 生成器中。无论如何,使用文本数据作为键是一种不常见的做法(出于您刚刚遇到的原因)。或者,您可以下载 EF 代码(它是 OSS)并修复它,如果您有时间...
  • @Colin 您应该将该链接添加到您的答案中 - 它非常相关

标签: sql-server linq c#-4.0 entity-framework-4.1 ef-model-first


【解决方案1】:

在外键周围创建一个带有 LOWER 的视图,以确保读取始终将相同的大小写返回给 EF。

并使用存储过程进行插入和删除

您可以在此处跟踪并投票支持要解决的问题:

String comparison differences between .NET and SQL Server cause problems for resolving FK relationships in the state manager

【讨论】:

  • 我毫不怀疑这个建议会奏效 - 但是我的问题是对我的实际问题的严重简化。在我的程序中有很多地方需要这样做 - 所以我希望有一个不那么“麻烦”的解决方案
  • 你得到赏金指出我的官方错误关系 - 谢谢:)
【解决方案2】:

在这种情况下,我没有所有信息,我认为您必须使用整数键更新表的关系才能建立关系。

当使用 linq 时,查询将在您调用 ToList() 或 First 时执行到数据库。如果您使用 Include,查询将在调用此操作的某些操作时加载数据。

A或a的问题可能是排序规则的情况,检查你的配置一些排序规则忽略数据的大小写。

我建议: 如果要加载相关数据,请使用整数键更新您正在使用的表并使用左外连接。有时使用好的旧 tsql 更好(你也可以在 linq 中进行左外连接)。

【讨论】:

  • 感谢您的回复 :) 不幸的是我不能make EF use collation 因为它不受支持:|我需要 EF 进行更改跟踪,所以我也不能手动处理 SQL。将表更改为使用int 而不是strings 是个好主意:) 但这是旧系统的核心表-我不敢更改它:s
【解决方案3】:

您可以在单独的查询中加载实体,而不是使用.Include。更改跟踪器将修复它已经在跟踪的相关实体的关系,如果您的查询正确,您应该得到一个从功能角度来看等同于使用.Include 的解决方案。

【讨论】:

  • 除了加载实体之外,我还需要做任何其他事情吗?我无法让它工作 - 我已经更新了我的问题。 (更新 3)
  • 我刚刚尝试过,你是对的 - 它不起作用。我认为这使用与.Include 相同的逻辑来查找关系。我以为您可以“修复”.ObjectMaterialized 事件中的键,但它也不起作用。你不能更新数据库中的数据,使大小写相同吗?
  • 这就是我们必须使用的解决方法。谢谢你的意见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多