2013-04-23 53 views
1

我使用的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事件探查器)至极更新所有的记录,其中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? 

我缺少什么?请帮忙!

+0

“DeleteTime”的类型是什么? – 2013-04-23 12:20:03

+0

你能分享这个生成的查询吗? – Pako 2013-04-23 12:20:08

+0

DeleteTime可以为空DateTime(DateTime?) – Andrei 2013-04-23 12:21:51

回答

1

理论上讲,更新基于实体的主键生成基础本身。

所以,你的情况下必须在事实上两个查询触发:

  1. 一个SELECT TOP 1你给
  2. 更新查询WHERE Id = entity.Id

生成的查询看起来很怪异的WHERE条款,所以主要的问题当然是你的桌子上没有主键定义。
另一个解决方案是数据库和你的ObjectContext之间的映射是完全搞砸的。检查Link类的实现。

+0

感谢您的回答,但我有主键。真的,查询看起来很奇怪 – Andrei 2013-04-23 12:31:31

1

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