以下代碼嘗試創建新記錄,然後在將其提交到數據庫之後進行修改。最後一次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)
我真的不喜歡這種做法,因爲它意味着我必須手動設置我相信數據上下文應該做的規模。
我還有其他使用DTO的原因,我很驚訝L2S設計者沒有更好地處理它... – LaserJesus 2009-03-24 00:02:24