C# 为什么我能';t保存当前日期时间。现在使用实体框架
GroupId和GroupDate是PK,GroupId是Identity(步骤=1),GroupDate不是PK 有人能告诉我为什么在使用这样一个简单的代码时会发生这种异常,以及如果可能的话如何关闭乐观并发更新吗 受意外事件影响的存储更新、插入或删除语句 行数(0)。实体可能已被修改或删除,因为 实体已加载。刷新ObjectStateManager条目C# 为什么我能';t保存当前日期时间。现在使用实体框架,c#,.net,entity-framework,C#,.net,Entity Framework,GroupId和GroupDate是PK,GroupId是Identity(步骤=1),GroupDate不是PK 有人能告诉我为什么在使用这样一个简单的代码时会发生这种异常,以及如果可能的话如何关闭乐观并发更新吗 受意外事件影响的存储更新、插入或删除语句 行数(0)。实体可能已被修改或删除,因为 实体已加载。刷新ObjectStateManager条目 不要关闭Optmistic并发更新,否则将隐藏问题,而不会修复它。请执行以下操作: using (var transaction = new
不要关闭Optmistic并发更新,否则将隐藏问题,而不会修复它。请执行以下操作:
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();
}
现在您正在DBContext中创建TransactionScope,我希望这将解决您的问题。这很可能是由于.NET
DateTime
类型和SQL Server中使用的列类型的精度不同造成的问题-可能是DateTime
通过SaveChanges
发送到数据库的INSERT语句如下所示:
using (var db = new MyEntities())
{
using (var transaction = new TransactionScope())
{
var newGroup = new Groups
{
GroupDate = DateTime.Now,
GroupName = "someName"
};
db.Groups.Add(newGroup);
db.SaveChanges();
transaction.Complete();
}
}
.NETDateTime
在小数点后存储7位:.515650
。但是SQLdatetime
类型无法存储该值,因为它的精度较低,并且在存储该值后某些数字会被截断。因此,where
子句中的比较[GroupDate]=@0
返回false
,EF返回未存储任何内容的信息(尽管实际执行了插入),取消事务并抛出异常
据我所知,您只能通过以下更改之一来解决此问题:
- 从主键中删除
,即使其成为非键列GroupDate
- 或者将SQL Server中的列类型更改为
,其精度与.NETdatetime2(7)
类型相同DateTime
- 或者提供精度较低的
,以便可以将值完全存储在SQLGroupDate
类型中,而不会被截断,例如,仅以秒为精度,毫秒为datetime
:0
(与上面的代码相比,从给定的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'
值中删除毫秒可能有更聪明的方法,但我现在找不到。)DateTime
日期时间。现在
需要任何特殊的东西才能与EF实体一起工作。只要尝试一下,它就会抛出例外情况您的表中的PK是什么?从未与TransactionScope
一起工作过,但您是否需要“切换”这两种用法使作用域位于上下文中,因为在使用它的上下文结束后,事务将无法再访问DB?因为我使用了DateTime.Now
很多与EF的组合,从来没有出现过这个问题。。。同样的异常我尝试过,但没有解决它,即使不使用事务也会发生这种情况,您可以尝试发布异常调用堆栈!我发现这与您的问题类似:这是一个具有不同未知原因的相同问题(至少对我而言),我认为删除您提到的millides
部分的更好的代码可能是:var date=now.addmillides(-now.Millisecond)代码>
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"
};