![](/img/trans.png)
[英]How can i calculate the difference between a stored DateTime.Now and a current DateTime.Now?
[英]why i can't save the current DateTime.Now using Entity Framework
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(步驟= 1)而GroupDate不是
任何人都可以告訴我為什么在使用像這樣的簡單代碼時發生這種異常以及如果可能的話如何關閉樂觀並發更新
存儲更新,插入或刪除語句會影響意外的行數(0)。 自實體加載后,實體可能已被修改或刪除。 刷新ObjectStateManager條目。
它很可能是.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
類型不能存儲它,因為它的精度較低,並且在存儲值后會切斷一些數字。 因此,比較[GroupDate] = @0
在where
子句返回false
和EF獲取信息后面什么也沒有存儲(雖然實際上INSERT 已執行),取消交易,並拋出異常。
據我所知,您只能通過以下更改之一解決此問題:
GroupDate
非鍵列 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
值中刪除毫秒,而不是上面的代碼,但我現在找不到。)
不要關閉Optmistic Concurrency Updates ,您將隱藏問題而不是修復它。 請執行下列操作:
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();
}
}
現在不同的是你在DBContext中創建TranscationScope我希望這能解決你的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.