Valores geradosGenerated Values

Padrões de geração de valorValue Generation Patterns

Existem três padrões de geração de valor que podem ser usados para propriedades:There are three value generation patterns that can be used for properties:

  • Não há geração de valorNo value generation
  • Adicionar valor gerado emValue generated on add
  • Valor gerado em Adicionar ou atualizarValue generated on add or update

Não há geração de valorNo value generation

Não há geração de valor significa que você sempre será fornecer um valor válido a ser salvo no banco de dados.No value generation means that you will always supply a valid value to be saved to the database. Esse valor válido deve ser atribuído às novas entidades antes de serem adicionados ao contexto.This valid value must be assigned to new entities before they are added to the context.

Adicionar valor gerado emValue generated on add

Valor gerado em Adicionar significa que um valor é gerado para novas entidades.Value generated on add means that a value is generated for new entities.

Dependendo do provedor de banco de dados que está sendo usado, os valores podem ser geradas do lado do cliente pelo EF ou no banco de dados.Depending on the database provider being used, values may be generated client side by EF or in the database. Se o valor é gerado pelo banco de dados, o EF pode atribuir um valor temporário quando você adiciona a entidade ao contexto.If the value is generated by the database, then EF may assign a temporary value when you add the entity to the context. Esse valor temporário, em seguida, será substituído pelo valor de banco de dados gerado durante a SaveChanges().This temporary value will then be replaced by the database generated value during SaveChanges().

Se você adicionar uma entidade ao contexto que tem um valor atribuído à propriedade, o EF tentará inserir esse valor em vez de gerar um novo.If you add an entity to the context that has a value assigned to the property, then EF will attempt to insert that value rather than generating a new one. Uma propriedade é considerada como tendo um valor atribuído se ele não é atribuído o valor padrão do CLR (null para string, 0 para int, Guid.Empty para Guid, etc.).A property is considered to have a value assigned if it is not assigned the CLR default value (null for string, 0 for int, Guid.Empty for Guid, etc.). Para obter mais informações, consulte valores explícitos para propriedades geradas.For more information, see Explicit values for generated properties.

Aviso

Como o valor é gerado para entidades adicionadas dependerá do provedor de banco de dados que está sendo usado.How the value is generated for added entities will depend on the database provider being used. Provedores de banco de dados automaticamente poderão configurar a geração de valor para alguns tipos de propriedade, mas outras podem exigir que você configurar manualmente a como o valor é gerado.Database providers may automatically setup value generation for some property types, but others may require you to manually setup how the value is generated.

Por exemplo, ao usar o SQL Server, valores serão gerados automaticamente para GUID propriedades (usando o algoritmo GUID sequencial do SQL Server).For example, when using SQL Server, values will be automatically generated for GUID properties (using the SQL Server sequential GUID algorithm). No entanto, se você especificar que um DateTime propriedade é gerada em Adicionar, em seguida, você deve configurar uma maneira para os valores a serem gerados.However, if you specify that a DateTime property is generated on add, then you must setup a way for the values to be generated. Uma maneira de fazer isso, é configurar um valor padrão de GETDATE(), consulte valores padrão.One way to do this, is to configure a default value of GETDATE(), see Default Values.

Valor gerado em Adicionar ou atualizarValue generated on add or update

Valor gerado ao adicionar ou atualização significa que um novo valor é gerado sempre que o registro é salvo (insert ou update).Value generated on add or update means that a new value is generated every time the record is saved (insert or update).

Como value generated on add, se você especificar um valor para a propriedade em uma instância recém adicionada de uma entidade, que o valor será inserido em vez de um valor que está sendo gerado.Like value generated on add, if you specify a value for the property on a newly added instance of an entity, that value will be inserted rather than a value being generated. Também é possível definir um valor explícito ao atualizar.It is also possible to set an explicit value when updating. Para obter mais informações, consulte valores explícitos para propriedades geradas.For more information, see Explicit values for generated properties.

Aviso

Como o valor é gerado para entidades adicionadas e atualizadas dependerá do provedor de banco de dados que está sendo usado.How the value is generated for added and updated entities will depend on the database provider being used. Provedores de banco de dados poderão configurar automaticamente a geração de valor para alguns tipos de propriedade, enquanto outros exigirão que você configurar manualmente a como o valor é gerado.Database providers may automatically setup value generation for some property types, while others will require you to manually setup how the value is generated.

Por exemplo, ao usar o SQL Server byte[] propriedades que são definidas como gerada em Adicionar ou atualizar e marcado como tokens de simultaneidade, será configurado com o rowversion de tipo de dados - para que os valores serão gerados no banco de dados.For example, when using SQL Server, byte[] properties that are set as generated on add or update and marked as concurrency tokens, will be setup with the rowversion data type - so that values will be generated in the database. No entanto, se você especificar que um DateTime propriedade é gerada em Adicionar ou atualizar, em seguida, você deve configurar uma maneira para os valores a serem gerados.However, if you specify that a DateTime property is generated on add or update, then you must setup a way for the values to be generated. Uma maneira de fazer isso, é configurar um valor padrão de GETDATE() (consulte valores padrão) para gerar valores para novas linhas.One way to do this, is to configure a default value of GETDATE() (see Default Values) to generate values for new rows. Em seguida, você pode usar um gatilho de banco de dados para gerar valores durante as atualizações (por exemplo, o gatilho de exemplo a seguir).You could then use a database trigger to generate values during updates (such as the following example trigger).

CREATE TRIGGER [dbo].[Blogs_UPDATE] ON [dbo].[Blogs]
    AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
                  
    IF ((SELECT TRIGGER_NESTLEVEL()) > 1) RETURN;
    
    DECLARE @Id INT
        
    SELECT @Id = INSERTED.BlogId
    FROM INSERTED
          
    UPDATE dbo.Blogs
    SET LastUpdated = GETDATE()
    WHERE BlogId = @Id
END

ConvençõesConventions

Por convenção, chaves primárias de não composição do tipo short, int, long ou Guid será configurado para ter valores gerados em Adicionar.By convention, non-composite primary keys of type short, int, long, or Guid will be setup to have values generated on add. Todas as outras propriedades será configurado com nenhuma geração de valor.All other properties will be setup with no value generation.

Anotações de dadosData Annotations

Não há geração de valor (anotações de dados)No value generation (Data Annotations)

public class Blog
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int BlogId { get; set; }
    public string Url { get; set; }
}

Valor gerado em add (anotações de dados)Value generated on add (Data Annotations)

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime Inserted { get; set; }
}

Aviso

Isso apenas permite que o EF Saiba que valores são gerados para entidades adicionadas, ele não garante que o EF irá configurar o mecanismo real para gerar os valores.This just lets EF know that values are generated for added entities, it does not guarantee that EF will setup the actual mechanism to generate values. Ver Adicionar valor gerado no seção para obter mais detalhes.See Value generated on add section for more details.

Valor gerado em Adicionar ou atualizar (anotações de dados)Value generated on add or update (Data Annotations)

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime LastUpdated { get; set; }
}

Aviso

Isso apenas permite que o EF Saiba que valores são gerados para entidades adicionadas ou atualizadas, ele não garante que o EF irá configurar o mecanismo real para gerar os valores.This just lets EF know that values are generated for added or updated entities, it does not guarantee that EF will setup the actual mechanism to generate values. Ver valor gerado em Adicionar ou atualizar para obter mais detalhes.See Value generated on add or update section for more details.

API fluenteFluent API

Você pode usar a API Fluent para alterar o padrão de geração de valor para uma determinada propriedade.You can use the Fluent API to change the value generation pattern for a given property.

Não há geração de valor (API Fluent)No value generation (Fluent API)

modelBuilder.Entity<Blog>()
    .Property(b => b.BlogId)
    .ValueGeneratedNever();

Valor gerado em add (API Fluent)Value generated on add (Fluent API)

modelBuilder.Entity<Blog>()
    .Property(b => b.Inserted)
    .ValueGeneratedOnAdd();

Aviso

ValueGeneratedOnAdd() apenas permite que o EF Saiba que os valores são gerados para entidades adicionadas, ele não garante que o EF irá configurar o mecanismo real para gerar os valores.ValueGeneratedOnAdd() just lets EF know that values are generated for added entities, it does not guarantee that EF will setup the actual mechanism to generate values. Ver Adicionar valor gerado no seção para obter mais detalhes.See Value generated on add section for more details.

Adicionar valor gerado no ou atualização (API Fluent)Value generated on add or update (Fluent API)

modelBuilder.Entity<Blog>()
    .Property(b => b.LastUpdated)
    .ValueGeneratedOnAddOrUpdate();

Aviso

Isso apenas permite que o EF Saiba que valores são gerados para entidades adicionadas ou atualizadas, ele não garante que o EF irá configurar o mecanismo real para gerar os valores.This just lets EF know that values are generated for added or updated entities, it does not guarantee that EF will setup the actual mechanism to generate values. Ver valor gerado em Adicionar ou atualizar para obter mais detalhes.See Value generated on add or update section for more details.