Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我能';t保存当前日期时间。现在使用实体框架_C#_.net_Entity Framework - Fatal编程技术网

C# 为什么我能';t保存当前日期时间。现在使用实体框架

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

GroupId和GroupDate是PK,GroupId是Identity(步骤=1),GroupDate不是PK

有人能告诉我为什么在使用这样一个简单的代码时会发生这种异常,以及如果可能的话如何关闭乐观并发更新吗

受意外事件影响的存储更新、插入或删除语句 行数(0)。实体可能已被修改或删除,因为 实体已加载。刷新ObjectStateManager条目


不要关闭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();
     }
}
.NET
DateTime
在小数点后存储7位:
.515650
。但是SQL
datetime
类型无法存储该值,因为它的精度较低,并且在存储该值后某些数字会被截断。因此,
where
子句中的比较
[GroupDate]=@0
返回
false
,EF返回未存储任何内容的信息(尽管实际执行了插入),取消事务并抛出异常

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

  • 从主键中删除
    GroupDate
    ,即使其成为非键列
  • 或者将SQL Server中的列类型更改为
    datetime2(7)
    ,其精度与.NET
    DateTime
    类型相同
  • 或者提供精度较低的
    GroupDate
    ,以便可以将值完全存储在SQL
    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"
};