2013-04-23 46 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。當表不包含主鍵或上下文實體和數據庫表之間存在一些主鍵區別時,可能會出現這樣的問題