以下代码试图创建一个新记录,然后在提交到数据库后修改它。最后的SubmitChanges()调用会抛出ChangeConflictException异常。
ItemA itemA = new ItemA();
itemA.Foo = "a";
itemA.Created = DateTimeOffset.Now.UtcDateTime;
ItemAs.InsertOnSubmit(itemA);
SubmitChanges();
itemA.Foo = "b";
SubmitChanges();
通过检查 dataContext.ChangeConflicts,我发现 Created 列存在冲突,尽管报告的 CurrentValue 和 DatabaseValue 看起来相同。经过仔细检查,我发现 Ticks 稍有不同。由于我已经将数据库中的 DateTimeOffset 列设置为 3 的刻度,即毫秒,它与 .NET 的值不相同,我认为它具有 7 的刻度。因此,Linq to Sql 注意到不匹配,并认为在上面显示的插入和更新之间,某些东西已修改了数据库。
除了编写一个扩展方法或其他可以在.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)
我不太喜欢这种方法,因为它意味着我必须手动设置比例,而我认为数据上下文应该做到这一点。