Code First EF Параллельный токен с Guid - PullRequest
1 голос
/ 05 ноября 2019

Я пытаюсь использовать 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:

builder.Property(c => c.Version)
                .IsConcurrencyToken()
                .ValueGeneratedOnAddOrUpdate();

В основном мне нужен совет о том, что я делаю неправильно.

1 Ответ

0 голосов
/ 05 ноября 2019

Я вижу несколько вещей, которые нуждаются в исправлении.

Оператор modelbuilder следует изменить, как показано ниже

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

Имейте в виду, что не существует стратегии генерирования стоимости, котораяуказано в свойстве Version. Когда мы генерируем миграцию с этим состоянием, сгенерированный файл Migration.cs назначает defaultValue new Guid("00000000-0000-0000-0000-000000000000")); внутри метода Up(). Ниже приведен пример

Contact Entity

Migration without Required attribute and without any value generation strategy

С другой стороны, если вы хотите новыйGuid добавляется каждый раз, когда вы вставляете новую строку в таблицу, вы должны использовать вычисляемое поле. Ниже на двух изображениях показана структура свойства Version, украшенного атрибутами и сгенерированной миграцией. Кроме того, для обозначения вычислений необходимо добавить следующий код строки:

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

Migration with Computed Field

Updated Entity With Computed Field

С упомянутыми изменениями вы получите новый Guid, успешно сгенерированный для каждой вставленной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...