【问题标题】:Code First EF Concurrency Token with Guid带 Guid 的 Code First EF 并发令牌
【发布时间】: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。我还没有找到其他可行的解决方案,所以我想把积分奖励给你。
  • 如果您在其他帖子中找到了解决方案,请将您的积分花在那里。很高兴您找到了解决方法。

标签: c# entity-framework-core


【解决方案1】:

我发现有几处需要纠正。

modelbuilder 语句应修改如下

 modelBuilder.Entity<Application>().Property(app => app.Version).ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();

请记住,没有在 Version 属性上指定值生成策略。当我们生成具有此状态的迁移时,生成的 Migration.cs 文件会在 Up() 方法内分配一个 defaultValue new Guid("00000000-0000-0000-0000-000000000000"));。下面是一个例子

另一方面,如果您希望每次在表中插入新行时都添加一个新的 Guid,您应该使用计算域。下面两张图显示了用属性修饰的 Version 属性的结构和生成的 Migration。另外,需要添加下面的代码来标记计算。

modelBuilder.Entity<Contact>().Property(t => t.Version).HasComputedColumnSql("NEWID()");

通过上述更改,您将为插入的每一行成功生成一个新的Guid

【讨论】:

  • 您的回答下了不少功夫,但请不要在图片中发布代码。在编辑答案/问题时使用代码格式化功能。图像中的文本既不能被搜索(即 SO 搜索或谷歌搜索)也不能复制和粘贴。 How do I write a good answer 可能值得一读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多