Генерация значений в 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; }
}