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

然后,当调用 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?

我错过了什么?请帮忙!

4

2 回答 2

1

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

因此,您的上下文实际上必须触发两个查询:

  1. ASELECT TOP 1WHERE您给出的子句
  2. 更新查询WHERE Id = entity.Id

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

于 2013-04-23T12:29:19.110 回答
1

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

于 2013-04-23T12:38:43.773 回答