Geração de Valor do SQL Server
Essa página detalha a configuração de geração de valor e os padrões específicos para o provedor do SQL Server. É recomendável ler a página geral sobre a geração de valor primeiro.
Colunas IDENTITY
Por convenção, as colunas numéricas configuradas para ter seus valores gerados na adição são configuradas como colunas IDENTITY do SQL Server.
Semente e incremento
Por padrão, as colunas IDENTITY começam em 1 (a semente) e incrementam em 1 sempre que uma linha é adicionada (o incremento). Você pode configurar uma semente e 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 IDENTITY_INSERT
manualmente antes de chamar SaveChanges()
, 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" });
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();
}
}
Observação
Temos uma solicitação de recurso em nossa lista de pendências para fazer isso automaticamente dentro do provedor 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, talvez você queira ter várias colunas desenhando seus valores padrão de uma única sequência.
O SQL Server permite criar sequências e usá-las conforme detalhado na página geral sobre sequências. Cabe a você configurar suas propriedades para usar sequências por meio de 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, não é necessário uma viagem de ida e volta extra do banco de dados para obter o valor gerado pelo banco de dados, quando um dependente que faz referência a essa chave também está sendo inserido.
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));
}
Rowversions
O SQL Server tem o tipo de dados rowversion
, que é alterado 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 simultaneidade e como usá-los, leia a página dedicada sobre conflitos de simultaneidade. 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; }
}