English 中文(简体)
我该如何防止DateTimeOffset比例在linq to Sql中引起ChangeConflictException?
原标题:
  • 时间:2009-02-04 07:20:12
  •  标签:

以下代码试图创建一个新记录,然后在提交到数据库后修改它。最后的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)

我不太喜欢这种方法,因为它意味着我必须手动设置比例,而我认为数据上下文应该做到这一点。

问题回答

由于您始终使用通用时间,我无法看出DateTimeOffset比DateTime有何优势。您可以使用DateTime.UtcNow,其精度与Sql Server的DateTime相同。

或者,由于您正在使用Sql Server 2008,您可以将字段存储为数据库中的DateTime2:这具有您需要的额外精度。





相关问题
热门标签