以下代码尝试创建新记录,然后在将其提交到数据库后对其进行修改。最后一次 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 看起来相同。经过仔细检查,我发现蜱虫略有不同。因为我已将数据库中的 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)
我不太喜欢这种方法,因为这意味着我必须手动设置我认为数据上下文应该执行的比例。