Создание значений 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);
}

Вставка явных значений в столбцы IDENTITY

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

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" });

    context.Database.OpenConnection();
    try
    {
        context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.Blogs ON");
        context.SaveChanges();
        context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.Blogs OFF");
    }
    finally
    {
        context.Database.CloseConnection();
    }
}

Примечание.

В нашем журнале заказов есть запрос на функцию, которая позволяет сделать это автоматически в пределах поставщика 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; }
}