2

以下代碼嘗試創建新記錄,然後在將其提交到數據庫之後進行修改。最後一次SubmitChanges()調用引發ChangeConflictException。如何阻止DateTimeOffset縮放引起linq中的ChangeConflictException到Sql?

ItemA itemA = new ItemA(); 
itemA.Foo = "a"; 
itemA.Created = DateTimeOffset.Now.UtcDateTime; 

ItemAs.InsertOnSubmit(itemA); 
SubmitChanges(); 

itemA.Foo = "b"; 
SubmitChanges(); 

通過研究我發現,「創造」列是衝突的,即使報道CurrentValue的和DatabaseValue出現相同的dataContext.ChangeConflicts。仔細觀察後,我發現Ticks略有不同。因爲我已經在數據庫中設置了DateTimeOffset列的縮放比例爲3,即毫秒,它不同於我認爲具有7的縮放比例的.NET版本。結果,Linq to Sql注意到不匹配,並認爲在上面顯示的插入和更新之間,有東西修改了數據庫。

除了編寫extentension方法或者我可以用來修改.NET精度的東西,還有更好的方法來處理這個問題嗎?


更新

我不得不依靠擴展方法,必須對模型設置的DateTimeOffset列時調用。

public static DateTimeOffset ToUniversalTime(this DateTimeOffset dto, int scale) { 
    DateTimeOffset utc = dto.ToUniversalTime(); 
    return utc.AddTicks(-(utc.Ticks % (int)Math.Pow(10, 7 - scale))); 
} 

如然後可以稱爲:

EntityFoo.Created = DateTimeOffset.Now.ToUniversalTime(3) 

我真的不喜歡這種做法,因爲它意味着我必須手動設置我相信數據上下文應該做的規模。

回答

1

由於您總是使用通用時間,我無法看到DateTimeOffset通過DateTime提供的優點。您可以使用DateTime.UtcNow,它具有與Sql Server的DateTime相同的精度。

或者,當您使用Sql Server 2008時,您可以將您的字段作爲DateTime2存儲在數據庫中:這具有您需要的額外準確性。

+0

我還有其他使用DTO的原因,我很驚訝L2S設計者沒有更好地處理它... – LaserJesus 2009-03-24 00:02:24