实体框架生成不适当的查询

本文关键字:查询 不适当 框架 实体 | 更新日期: 2023-09-27 18:10:24

我使用EntityFramework 4。我面临着实体框架的奇怪问题,下面是代码:

public void UpdateLink(Link link)
{
     Link existing = ObjectContext
                    .Link
                    .FirstOrDefault(p => p.ItemLeft == link.ItemLeft 
                                      && p.ItemRight == link.ItemRight 
                                      && p.DeleteTime == null);
    if (existing != null)
    {
        existing.DeleteTime = link.DeleteTime;
    }
    ObjectContext.SaveChanges();
}

假设找到了现有项,并为该项设置了DeleteTime。(if语句被传递)

然后当SaveChanges被调用时,我得到查询(与sql profiler),其中更新所有记录ItemLeft是X, ItemRight是Y.事实上,它忽略了DeleteTime = null条件…

看起来像这样:

exec sp_executesql N'update [Link] set [DeleteTime] = @0
where (([ItemLeft] = @1) and ([ItemRight] = @2))
',N'@0 datetime,@1 int,@2 int',@0='2013-04-23 14:58:21.853',@1=857,@2=872
表结构:

ID [PK]
(index)LeftItem int
(index)RightItem int
(index)DeleteTime datetime?

我错过了什么?请帮助!

实体框架生成不适当的查询

理论上,更新是基于实体的主键生成的。

所以你的上下文必须触发两个查询:

  1. SELECT TOP 1WHERE条款你给
  2. 更新查询WHERE Id = entity.Id

生成的查询看起来很奇怪,所以主要的问题肯定是你没有在你的表上定义主键。
另一种解决方案是,数据库和ObjectContext之间的映射完全搞砸了。查看Link类的实现

感谢Scorpi0和Maarten。当表不包含主键或上下文实体与数据库表

之间存在一些主键差异时,可能会出现此类问题。