gpt4 book ai didi

c# - 为什么我不能使用 Entity Framework 保存当前的 DateTime.Now

转载 作者:太空狗 更新时间:2023-10-29 21:09:21 27 4
gpt4 key购买 nike

using (var transaction = new TransactionScope())
{
using (var db = new MyEntities())
{
var newGroup = new Groups
{
GroupDate = DateTime.Now,
GroupName = "someName"
};
db.Groups.Add(newGroup);
db.SaveChanges();
}
transaction.Complete();
}

GroupId 和 GroupDate 是 PK,GroupId 是 Identity(step = 1) 而 GroupDate 不是

谁能告诉我为什么在使用像这样的简单代码时会发生此异常,以及如何关闭乐观并发更新(如果可能的话)

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

最佳答案

这很可能是 .NET DateTime 类型和您在 SQL Server 中使用的列类型的精度不同的问题 - 可能是 datetime

使用 SaveChanges 发送到数据库的 INSERT 语句如下所示:

exec sp_executesql N'insert [dbo].[Groups]([GroupDate], [GroupName])
values (@0, @1)
select [GroupId]
from [dbo].[Groups]
where @@ROWCOUNT > 0 and [GroupId] = scope_identity() and [GroupDate] = @0',
N'@0 datetime2(7),@1 nvarchar(50)',
@0='2013-09-01 14:21:44.5156250',@1=N'someName'

.NET DateTime 存储小数点后 7 位:.5156250。但是 SQL datetime 类型不能存储这个,因为它的精度较低,并且在存储值后会截掉一些数字。因此,where 子句中的比较 [GroupDate] = @0 返回 false 并且 EF 得到返回的信息,即没有存储任何内容(尽管INSERT 实际上已经 执行),取消事务并抛出异常。

据我所知,您只能通过以下更改之一来解决此问题:

  • 要么从主键中删除 GroupDate,即使其成为非键列
  • 或者将 SQL Server 中列的类型更改为 datetime2(7),与 .NET DateTime 类型具有相同的精度
  • 或者为您的 GroupDate 提供精度较低的值,以便该值可以完全存储在 SQL datetime 类型中而不会被截断,例如仅以秒为单位精度和毫秒为 0:

    var now = DateTime.Now;
    var date = new DateTime(now.Year, now.Month, now.Day,
    now.Hour, now.Minute, now.Second);

    var newGroup = new Groups
    {
    GroupDate = date,
    GroupName = "someName"
    };

    (可能有比上面的代码更聪明的方法来从给定的 DateTime 值中删除毫秒,但我现在找不到。)

关于c# - 为什么我不能使用 Entity Framework 保存当前的 DateTime.Now,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557546/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com