我正在用EF6從我的資料庫中生成物體模型。我創建了兩個測驗表。一個表有一個身份列,而另一個表沒有。下面是這些表:
CREATE TABLE [dbo].[TestNoIdentity]
(
[ID] INT NOT NULL,
[DTStamp] DATETIME NOT NULL,
[注] VARCHAR(255) NULL,
PRIMARY KEY CLUSTERED ([ID] ASC, [DTStamp] ASC)
);
創建 表 [dbo].[TestIdentity].
(
[ID] INT IDENTITY (1, 1) NOT NULL,
[DTStamp] DATETIME NOT NULL,
[注] VARCHAR(255) NULL,
PRIMARY KEY CLUSTERED ([ID] ASC, [DTStamp] ASC)
);
測驗代碼:
using (TestEntities entities = newTestEntities()
{
//這就可以了
var entry1 = new TestNoIdentity();
entry1.ID = 1;
entry1.DTStamp = DateTime.Now。
entry1.Note = "No Identity";
entities.TestNoIdentity.Add(entry1)。
entities.SaveChanges()。
//這不起作用。
var entry2 = new TestIdentity();
entry2.DTStamp = DateTime.Now;
entities.TestIdentity.Add(entry2);
entities.SaveChanges(); //樂觀的并發性例外
//這個查詢作業
// entities.Database.ExecuteSqlCommand("INSERT INTO [dbo]. [TestIdentity] ([DTStamp]) VALUES ('1/1/2021 12: 00:00 PM')")。)
return entities.ID.ToString()。
為什么會拋出一個并發性例外?沒有其他用戶或物體的重復實體。
來自例外的訊息:
存盤更新、插入或洗掉陳述句影響了一個意外的行數(0)。自從物體被加載后,物體可能已經被修改或洗掉了。
物體被加載后,物體可能已經被修改或洗掉了。
uj5u.com熱心網友回復:
在沒有IDENTITY的情況下,EF不需要取回ID,而這正是它失敗的地方。 你的PK中有一個DATETIME列,而DATETIME的精度只有3ms左右,所以比較存盤值和生成值可能會失敗。 把它改為DATETIME2以更好地匹配.NET的DateTime的精度,或者把你的.NET DateTime修剪到最接近的秒數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/309868.html
標籤:
