.net 如何阻止DateTimeOffset比例在linq到Sql中导致ChangeConflictException?

.net 如何阻止DateTimeOffset比例在linq到Sql中导致ChangeConflictException?,.net,linq-to-sql,sql-server-2008,concurrency,datetimeoffset,.net,Linq To Sql,Sql Server 2008,Concurrency,Datetimeoffset,下面的代码尝试创建一个新记录,然后在将其提交到数据库后对其进行修改。最后一个SubmitChanges()调用引发ChangeConflictException ItemA itemA = new ItemA(); itemA.Foo = "a"; itemA.Created = DateTimeOffset.Now.UtcDateTime; ItemAs.InsertOnSubmit(itemA); SubmitChanges(); itemA.Foo = "b"; SubmitChang

下面的代码尝试创建一个新记录,然后在将其提交到数据库后对其进行修改。最后一个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。结果,linqtosql注意到了不匹配,并认为在上面显示的插入和更新之间,有什么东西修改了数据库

除了写一个extenstence方法或者我可以用它来修改.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:这具有所需的额外准确性。

我使用DTO还有其他原因,我很惊讶L2S设计器没有更好地处理它。。。