Поделиться через


Генерация значений в SQL Server

Эта страница содержит сведения о конфигурации и шаблонах создания значений, относящихся к поставщику SQL Server. Рекомендуется сначала прочитать общую страницу о создании ценности.

Столбцы IDENTITY

По соглашению числовые столбцы, настроенные для создания их значений при добавлении, настраиваются как столбцы IDENTITY SQL Server.

Начальное и добавочное

По умолчанию столбцы IDENTITY начинаются с 1 (начального значения) и увеличиваются на 1 при каждом добавлении строки (приращение). Вы можете настроить другое начальное значение и шаг следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.BlogId)
        .UseIdentityColumn(seed: 10, increment: 10);
}

Вставка явных значений в столбцы ИДЕНТИЧНОСТИ

По умолчанию SQL Server не разрешает вставлять явные значения в столбцы IDENTITY. Для этого необходимо вручную включить IDENTITY_INSERT перед вызовом SaveChangesAsync()следующим образом:

using (var context = new ExplicitIdentityValuesContext())
{
    context.Blogs.Add(new Blog { BlogId = 100, Url = "http://blog1.somesite.com" });
    context.Blogs.Add(new Blog { BlogId = 101, Url = "http://blog2.somesite.com" });

    await context.Database.OpenConnectionAsync();
    try
    {
        await context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT dbo.Blogs ON");
        await context.SaveChangesAsync();
        await context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT dbo.Blogs OFF");
    }
    finally
    {
        await context.Database.CloseConnectionAsync();
    }
}

Заметка

У нас есть запрос на функцию в нашем списке задач, чтобы внедрить это автоматически в рамках поставщика SQL Server.

Последовательности

В качестве альтернативы столбцам IDENTITY можно использовать стандартные последовательности. Это может быть полезно в различных сценариях; Например, может потребоваться создать несколько столбцов, нарисовав значения по умолчанию из одной последовательности.

SQL Server позволяет создавать последовательности и использовать их, как описано в общей странице последовательностей. Вы можете настроить свойства для использования последовательностей с помощью HasDefaultValueSql().

Глобальные уникальные идентификаторы (GUID)

Для первичных ключей GUID поставщик автоматически создает оптимальные последовательные значения, аналогичные функции NEWSEQUENTIALID SQL Server. Создание значения на клиенте более эффективно в некоторых сценариях, а именно, когда для получения значения, сгенерированного базой данных, не требуется дополнительный запрос к базе данных, если также вставляется зависимый объект, который ссылается на этот ключ.

Чтобы EF создавал те же последовательные значения GUID для свойств, отличных от ключа, настройте их следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}

Rowversions

SQL Server имеет тип данных rowversion, который автоматически изменяется при обновлении строки. Это делает его очень полезным в качестве маркера параллелизма для управления случаями, когда одна и та же строка одновременно обновляется несколькими транзакциями.

Чтобы полностью понять маркеры параллелизма и их использование, ознакомьтесь с выделенной страницей конфликтов параллелизма . Чтобы сопоставить свойство byte[] с столбцом rowversion, настройте его следующим образом:

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [Timestamp]
    public byte[] Version { get; set; }
}