2

以下代码尝试创建新记录,然后在将其提交到数据库后对其进行修改。最后一次 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)

我不太喜欢这种方法,因为这意味着我必须手动设置我认为数据上下文应该执行的比例。

4

1 回答 1

1

由于您总是使用世界时,我看不出 DateTimeOffset 比 DateTime 有什么优势。您可以使用 DateTime.UtcNow,它与 Sql Server 的 DateTime 具有相同的精度。

或者,当您使用 Sql Server 2008 时,您可以将字段作为 DateTime2 存储在数据库中:这具有您需要的额外准确性。

于 2009-03-10T05:53:49.883 回答