Valeurs généréesGenerated Values

Modèles de génération de valeurValue Generation Patterns

Il existe trois modèles de génération de valeur qui peuvent être utilisées pour les propriétés :There are three value generation patterns that can be used for properties:

  • Aucune génération de valeurNo value generation
  • Valeur générée sur AjouterValue generated on add
  • Valeur générée dans Ajouter ou mettre à jourValue generated on add or update

Aucune génération de valeurNo value generation

Aucune génération de valeur ne signifie que vous fournirez toujours une valeur valide pour être enregistrés dans la base de données.No value generation means that you will always supply a valid value to be saved to the database. Cette valeur valide doit être affectée aux nouvelles entités avant d’être ajoutés au contexte.This valid value must be assigned to new entities before they are added to the context.

Valeur générée sur AjouterValue generated on add

Valeur générée sur Ajouter signifie une valeur générée pour les nouvelles entités.Value generated on add means that a value is generated for new entities.

Selon le fournisseur de base de données utilisé, les valeurs peuvent être générées côté client par Entity Framework ou dans la base de données.Depending on the database provider being used, values may be generated client side by EF or in the database. Si la valeur est générée par la base de données, EF peut affecter une valeur temporaire lorsque vous ajoutez l’entité au contexte.If the value is generated by the database, then EF may assign a temporary value when you add the entity to the context. Cette valeur temporaire est alors remplacée par la valeur de la base de données générée au cours de SaveChanges().This temporary value will then be replaced by the database generated value during SaveChanges().

Si vous ajoutez une entité au contexte qui a la valeur affectée à la propriété, puis EF tente insérer cette valeur au lieu de générer un nouveau.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. Une propriété est considérée comme ayant une valeur affectée s’il n’est pas affecté la valeur par défaut CLR (null pour string, 0 pour int, Guid.Empty pour 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.). Pour plus d’informations, consultez explicitement les valeurs des propriétés générées.For more information, see Explicit values for generated properties.

Avertissement

Comment la valeur est générée pour les entités ajoutées dépendent du fournisseur de base de données utilisé.How the value is generated for added entities will depend on the database provider being used. Fournisseurs de base de données peuvent configurer automatiquement la génération de valeur pour certains types de propriété, mais d’autres peuvent nécessiter vous permettent de configurer manuellement la façon dont la valeur est générée.Database providers may automatically setup value generation for some property types, but others may require you to manually setup how the value is generated.

Par exemple, lorsque vous utilisez SQL Server, les valeurs seront être générées automatiquement pour GUID propriétés (à l’aide de l’algorithme GUID séquentiel de SQL Server).For example, when using SQL Server, values will be automatically generated for GUID properties (using the SQL Server sequential GUID algorithm). Toutefois, si vous indiquez qu’un DateTime propriété est générée lors de l’ajout, puis vous devez configurer un moyen pour les valeurs à être généré.However, if you specify that a DateTime property is generated on add, then you must setup a way for the values to be generated. Pour faire cela, consiste à configurer une valeur par défaut de GETDATE(), consultez valeurs par défaut.One way to do this, is to configure a default value of GETDATE(), see Default Values.

Valeur générée dans Ajouter ou mettre à jourValue generated on add or update

Valeur générée lors de l’ajout ou la mise à jour signifie qu’une nouvelle valeur est générée chaque fois que l’enregistrement (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).

Comme value generated on add, si vous spécifiez une valeur pour la propriété sur une instance nouvellement ajoutée d’une entité, que la valeur sera insérée plutôt qu’une valeur en cours de génération.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. Il est également possible de définir une valeur explicite lors de la mise à jour.It is also possible to set an explicit value when updating. Pour plus d’informations, consultez explicitement les valeurs des propriétés générées.For more information, see Explicit values for generated properties.

Avertissement

Comment la valeur est générée pour les entités ajoutées et mis à jour dépend du fournisseur de base de données utilisé.How the value is generated for added and updated entities will depend on the database provider being used. Fournisseurs de base de données peuvent configurer automatiquement la génération de valeur pour certains types de propriété, tandis que d’autres nécessiteront vous permettent de configurer manuellement la façon dont la valeur est générée.Database providers may automatically setup value generation for some property types, while others will require you to manually setup how the value is generated.

Par exemple, lors de l’utilisation de SQL Server, byte[] propriétés qui sont définies comme générées sur Ajouter ou mettre à jour et les jetons d’accès concurrentiel, la mention sera configuré avec le rowversion de type de données - afin que les valeurs dans la base de données va être générés.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. Toutefois, si vous indiquez qu’un DateTime propriété est générée sous Ajouter ou mettre à jour, puis vous devez configurer un moyen pour les valeurs à être généré.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. Pour faire cela, consiste à configurer une valeur par défaut de GETDATE() (consultez valeurs par défaut) pour générer des valeurs pour les nouvelles lignes.One way to do this, is to configure a default value of GETDATE() (see Default Values) to generate values for new rows. Vous pouvez ensuite utiliser un déclencheur de base de données pour générer des valeurs pendant les mises à jour (par exemple, le déclencheur suivant de l’exemple).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

ConventionsConventions

Par convention, non composites des clés primaires de type short, int, long ou Guid sera configuré pour avoir des valeurs générées sur Ajouter.By convention, non-composite primary keys of type short, int, long, or Guid will be setup to have values generated on add. Toutes les autres propriétés sera configuré avec aucune génération de valeur.All other properties will be setup with no value generation.

Annotations de donnéesData Annotations

Aucune génération de valeur (Annotations de données)No value generation (Data Annotations)

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

Valeur générée sur Ajouter (Annotations de données)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; }
}

Avertissement

Cela permet simplement EF de savoir que les valeurs sont générées pour les entités ajoutées, cela ne garantit pas que EF vous permettront de configurer le mécanisme pour générer des valeurs.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. Consultez ajouter de la valeur générée sur section pour plus d’informations.See Value generated on add section for more details.

Valeur générée sur Ajouter ou mettre à jour (Annotations de données)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; }
}

Avertissement

Cela permet simplement EF de savoir que les valeurs sont générées pour les entités ajoutées ou mises à jour, il ne garantit pas que EF vous permettront de configurer le mécanisme pour générer des valeurs.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. Consultez valeur générée sur Ajouter ou mettre à jour section pour plus d’informations.See Value generated on add or update section for more details.

API FluentFluent API

Vous pouvez utiliser l’API Fluent à modifier le modèle de génération de valeur pour une propriété donnée.You can use the Fluent API to change the value generation pattern for a given property.

Aucune génération de valeur (API Fluent)No value generation (Fluent API)

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

Valeur générée sur Ajouter (API Fluent)Value generated on add (Fluent API)

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

Avertissement

ValueGeneratedOnAdd() Venez informe Entity Framework que les valeurs sont générées pour les entités ajoutées, cela ne garantit pas que EF vous permettront de configurer le mécanisme pour générer des valeurs.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. Consultez ajouter de la valeur générée sur section pour plus d’informations.See Value generated on add section for more details.

Valeur générée sur Ajouter ou mettre à jour (API Fluent)Value generated on add or update (Fluent API)

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

Avertissement

Cela permet simplement EF de savoir que les valeurs sont générées pour les entités ajoutées ou mises à jour, il ne garantit pas que EF vous permettront de configurer le mécanisme pour générer des valeurs.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. Consultez valeur générée sur Ajouter ou mettre à jour section pour plus d’informations.See Value generated on add or update section for more details.