【发布时间】:2021-11-14 17:52:11
【问题描述】:
我尝试使用 GUID 作为并发令牌,但每次尝试插入记录时都会出现无法添加空值的异常。
生成的 SQL 和异常消息:
Failed executing DbCommand (4ms) [Parameters=[@p0='?' (DbType = Guid), @p1='?' (Size = 10) (DbType = AnsiString), @p2='?' (Size = 150) (DbType = AnsiString)], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
INSERT INTO [Application] ([Id], [Code], [Name])
VALUES (@p0, @p1, @p2);
SELECT [Version]
FROM [Application]
WHERE @@ROWCOUNT = 1 AND [Id] = @p0; System.Data.SqlClient.SqlException (0x80131904): Cannot insert the value NULL into column 'Version', table 'MyCompany.dbo.Application'; column does not allow nulls. INSERT fails.
public class Application
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
// A concurrency token for use with the optimistic concurrency checking
public Guid Version { get; set; }
}
使用模型构建器:
builder.Property(c => c.Version)
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate();
基本上,我需要关于我做错了什么的建议。
【问题讨论】:
-
链接的问题与作为并发令牌的 DateTime 有关。来自 Microsoft 参考:例如,使用 SQL Server 时,将为 GUID 属性自动生成值(使用 SQL Server 顺序 GUID 算法)。但是,如果您指定在添加时生成 DateTime 属性,则必须设置生成值的方式。
-
是的,你是对的,我删除了接近投票。 (仅供参考,这是链接文章:stackoverflow.com/questions/49634598/…)
-
@nilsK 你能不能把你的作为anwser。我还没有找到其他可行的解决方案,所以我想把积分奖励给你。
-
如果您在其他帖子中找到了解决方案,请将您的积分花在那里。很高兴您找到了解决方法。