繁体   English   中英

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

[英]Entity Framework generates inappropriate query

我正在使用EntityFramework4。我遇到了实体框架的奇怪问题,这是代码:

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。 (如果通过了声明)

然后,当调用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. 您提供的带有WHERE子句的SELECT TOP 1
  2. 更新查询WHERE Id = entity.Id

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

感谢Scorpi0和Maarten。 当表不包含主键或上下文实体和数据库表之间存在一些主键差异时,可能会出现此类问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM