2013-09-01 63 views
5
using (var transaction = new TransactionScope()) 
{ 
    using (var db = new MyEntities()) 
    {  
      var newGroup = new Groups 
      { 
       GroupDate = DateTime.Now, 
       GroupName = "someName" 
      }; 
      db.Groups.Add(newGroup); 
      db.SaveChanges(); 
    } 
    transaction.Complete(); 
} 

groupId和GroupDate是PK,是的GroupId標識(步= 1),GroupDate不爲什麼使用實體框架,我不能保存當前DateTime.Now

任何一個可以告訴我,爲什麼這個異常當使用這樣一個簡單的代碼,以及如何關閉樂觀併發更新,如果有可能

商店更新,插入或刪除語句影響了意外 行數的發生(0)。自從裝載了實體 以來,實體可能已被修改或刪除。刷新ObjectStateManager條目。

+0

不知道你的問題是什麼,但我不記得'DateTime.Now'需要任何特殊的東西來處理EF實體。 –

+0

只是試試它會拋出異常 –

+1

表中的PK是什麼? –

回答

8

這很可能是您在SQL Server中使用的.NET DateTime類型和列類型的不同精度的問題 - 可能是datetime

發送到數據庫與SaveChanges INSERT語句如下:

exec sp_executesql N'insert [dbo].[Groups]([GroupDate], [GroupName]) 
values (@0, @1) 
select [GroupId] 
from [dbo].[Groups] 
where @@ROWCOUNT > 0 and [GroupId] = scope_identity() and [GroupDate] = @0', 
N'@0 datetime2(7),@1 nvarchar(50)', 
@0='2013-09-01 14:21:44.5156250',@1=N'someName' 

的.NET DateTime存儲小數點後7位:.5156250。但是SQL datetime類型不能存儲它,因爲它具有較低的精度,並且在存儲該值後會切斷一些數字。因此,where子句中的比較[GroupDate] = @0返回false,並且EF獲取沒有任何內容存儲的信息(儘管INSERT實際上已執行),取消事務並拋出異常。

至於我能看到你只能通過下列變更事項之一解決這個問題:

  • 無論是從主鍵刪除GroupDate,即讓非鍵列
  • 或更改在SQL Server中的列到datetime2(7)具有相同精度作爲.NET DateTime
  • 或提供類型的GroupDate精度較低,這樣的值可以完全存儲在SQL datetime型無單eing切斷,例如只能用秒精度和毫秒爲0

    var now = DateTime.Now; 
    var date = new DateTime(now.Year, now.Month, now.Day, 
             now.Hour, now.Minute, now.Second); 
    
    var newGroup = new Groups 
    { 
        GroupDate = date, 
        GroupName = "someName" 
    }; 
    

    (有可能是從比上面的代碼給定DateTime值去除毫秒的更聰明的辦法,但我找不到)

+2

我認爲更好的代碼移除你提到的毫秒部分可能是這樣的:'var date = now.AddMilliseconds(-now.Millisecond);' –

1

不要切換Optmistic併發性更新關閉你將隱藏問題,而不是修復它。做到以下幾點:

using (var db = new MyEntities()) 
{  
    using (var transaction = new TransactionScope()) 
    { 
     var newGroup = new Groups 
     { 
      GroupDate = DateTime.Now, 
      GroupName = "someName" 
     }; 
     db.Groups.Add(newGroup); 
     db.SaveChanges(); 
     transaction.Complete(); 
    } 
} 

不同,現在你正在創建的DbContext內TranscationScope我希望這將解決您的問題。

+1

我嘗試過但它沒有解決它,即使沒有使用事務也會發生這種情況,您可以嘗試使用 –

+0

請發送異常調用堆棧! –

+0

我發現這與你的問題類似:http://stackoverflow.com/questions/1836173/entity-framework-store-update-insert-or-delete-statement-affected-an-unexpec –

相關問題