Geração de valor do SQL Server
Esta página detalha a configuração e os padrões de geração de valor específicos do provedor do SQL Server. Recomenda-se ler primeiro a página geral sobre geração de valor.
Colunas IDENTIDADE
Por convenção, as colunas numéricas configuradas para ter seus valores gerados na adição são configuradas como colunas IDENTITY SQL Server.
Semente e incremento
Por padrão, as colunas IDENTITY começam em 1 (a semente) e aumentam em 1 cada vez que uma linha é adicionada (o incremento). Você pode configurar uma semente e um incremento diferentes da seguinte maneira:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.UseIdentityColumn(seed: 10, increment: 10);
}
Inserindo valores explícitos em colunas IDENTITY
Por padrão, o SQL Server não permite inserir valores explícitos em colunas IDENTITY. Para fazer isso, você deve habilitar manualmente IDENTITY_INSERT
antes de chamar SaveChangesAsync()
, da seguinte maneira:
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();
}
}
Observação
Temos um pedido de funcionalidade na nossa lista de tarefas pendentes para realizar esta tarefa automaticamente no fornecedor do SQL Server.
Sequências
Como alternativa às colunas IDENTITY, você pode usar sequências padrão. Isso pode ser útil em vários cenários; Por exemplo, você pode querer ter várias colunas desenhando seus valores padrão de uma única sequência.
O SQL Server permite criar sequências e utilizá-las conforme detalhado na página geral sobre sequências . Cabe a você configurar suas propriedades para usar sequências via HasDefaultValueSql()
.
GUIDs
Para chaves primárias GUID, o provedor gera automaticamente valores sequenciais ideais, semelhantes à função NEWSEQUENTIALID do SQL Server. Gerar o valor no cliente é mais eficiente em alguns cenários, ou seja, uma viagem de ida e volta extra ao banco de dados não é necessária para obter o valor gerado pelo banco de dados, quando um dependente também está sendo inserido que faz referência a essa chave.
Para que o EF gere os mesmos valores de GUID sequenciais para propriedades não-chave, configure-os da seguinte maneira:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.Guid).HasValueGenerator(typeof(SequentialGuidValueGenerator));
}
Versões de linha
O SQL Server tem o tipo de dados rowversion
, que muda automaticamente sempre que a linha é atualizada. Isso o torna muito útil como um token de simultaneidade, para gerenciar casos em que a mesma linha é atualizada simultaneamente por várias transações.
Para entender completamente os tokens de concorrência e como usá-los, leia a página dedicada sobre conflitos de concorrência. Para mapear uma propriedade byte[]
para uma coluna rowversion
, configure-a da seguinte maneira:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Timestamp]
public byte[] Version { get; set; }
}