生成された値Generated Values

値の生成のパターンValue Generation Patterns

プロパティを使用できる 3 つの値の生成パターンがないです。There are three value generation patterns that can be used for properties:

  • 値を生成しません。No value generation
  • 生成された値を追加します。Value generated on add
  • 生成された値で追加または更新Value generated on add or update

値を生成しません。No value generation

値の生成がありません、データベースに保存する有効な値を常に指定されます。No value generation means that you will always supply a valid value to be saved to the database. この有効な値は、コンテキストに追加される前に新しいエンティティに割り当てる必要があります。This valid value must be assigned to new entities before they are added to the context.

生成された値を追加します。Value generated on add

生成された値が意味を追加する新しいエンティティの値が生成されます。Value generated on add means that a value is generated for new entities.

使用されているデータベース プロバイダーによって、値があります EF によって、またはデータベース内のクライアント側を生成します。Depending on the database provider being used, values may be generated client side by EF or in the database. 値は、データベースによって生成、し、EF 割り当てられる一時的な値をコンテキストにエンティティを追加するとします。If the value is generated by the database, then EF may assign a temporary value when you add the entity to the context. この一時的な値は中にデータベースで生成された値で置き換えられますSaveChanges()します。This temporary value will then be replaced by the database generated value during SaveChanges().

プロパティに割り当てられている値を持つコンテキストにエンティティを追加する場合、EF を新たに生成するのではなく、その値を挿入しようとします。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. プロパティは、CLR の既定値が割り当てられていない場合に割り当てられている値を持つと見なされます (nullstring0intGuid.EmptyGuidなど。)。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.). 詳細については、次を参照してください。生成されたプロパティの値を明示的します。For more information, see Explicit values for generated properties.

警告

追加されたエンティティの値を生成する方法は、使用中のデータベース プロバイダーによって異なります。How the value is generated for added entities will depend on the database provider being used. データベース プロバイダーがいくつかのプロパティの型の値を生成をセットアップして自動的には、値を生成する方法を手動で設定する他のユーザー必要があります。Database providers may automatically setup value generation for some property types, but others may require you to manually setup how the value is generated.

たとえば、SQL Server を使用する場合の値が自動的に生成されますのGUIDプロパティ (SQL Server のシーケンシャルな GUID アルゴリズムを使用して)。For example, when using SQL Server, values will be automatically generated for GUID properties (using the SQL Server sequential GUID algorithm). ただし、ことを指定する場合、DateTimeプロパティが生成されるで追加の値を生成する方法をセットアップする必要があります。However, if you specify that a DateTime property is generated on add, then you must setup a way for the values to be generated. 既定値を構成するには、1 つの方法は、GETDATE()を参照してください既定値します。One way to do this, is to configure a default value of GETDATE(), see Default Values.

生成された値で追加または更新Value generated on add or update

生成された値で追加または更新は、レコードが (挿入または更新) を保存するたびに、新しい値が生成されることを意味します。Value generated on add or update means that a new value is generated every time the record is saved (insert or update).

ようなvalue generated on add新しく追加された値が生成される値ではなく挿入することは、エンティティのインスタンスでプロパティの値を指定する場合、します。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. 更新するときに、明示的な値を設定することもできます。It is also possible to set an explicit value when updating. 詳細については、次を参照してください。生成されたプロパティの値を明示的します。For more information, see Explicit values for generated properties.

警告

追加および更新されたエンティティの値を生成する方法は、使用中のデータベース プロバイダーによって異なります。How the value is generated for added and updated entities will depend on the database provider being used. データベース プロバイダー、他のユーザーが必要とする値を生成する方法を手動で設定するプロパティの種類によっての値を生成が自動的にセットアップ可能性があります。Database providers may automatically setup value generation for some property types, while others will require you to manually setup how the value is generated.

たとえば、SQL Server を使用してbyte[]で生成されるように設定されているプロパティの追加または更新、および同時実行トークンとしてマークされているに設定されます。、rowversionデータ型の値は、データベースで生成するようにします。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. ただし、ことを指定する場合、DateTimeプロパティが生成されるで追加または更新の値を生成する方法をセットアップする必要があります。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. 既定値を構成するには、1 つの方法は、 GETDATE() (を参照してください既定値) を新しい行の値を生成します。One way to do this, is to configure a default value of GETDATE() (see Default Values) to generate values for new rows. データベース トリガーを使用して、(次の例のトリガー) などの更新中に値を生成する可能性があります。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

規約Conventions

慣例により、型 short、int 型の非複合主キーが長い、または Guid をセットアップして、追加で生成された値となります。By convention, non-composite primary keys of type short, int, long, or Guid will be setup to have values generated on add. その他のすべてのプロパティ値を生成しないとセットアップになります。All other properties will be setup with no value generation.

データの注釈Data Annotations

値を生成しない (データ注釈)No value generation (Data Annotations)

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

生成された値 (データ注釈) を追加します。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; }
}

警告

これにより、EF に追加されたエンティティの値が生成される、EF が実際の値を生成するメカニズムを設定することが保証されないことを通知ことだけです。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. 参照してくださいで生成された値を追加詳細セクション。See Value generated on add section for more details.

生成された値を追加または更新 (データ注釈)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; }
}

警告

これにより、EF に通知を追加または更新されたエンティティの値が生成される、EF が実際の値を生成するメカニズムを設定することは保証されないことだけです。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. 参照してくださいで生成された値を追加または更新詳細セクション。See Value generated on add or update section for more details.

Fluent APIFluent API

Fluent API を使用して、特定のプロパティの値の生成のパターンを変更することができます。You can use the Fluent API to change the value generation pattern for a given property.

値を生成しない (Fluent API)No value generation (Fluent API)

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

生成された値 (Fluent API) を追加します。Value generated on add (Fluent API)

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

警告

ValueGeneratedOnAdd() だけが EF に追加されたエンティティの値が生成される、EF が実際の値を生成するメカニズムを設定することが保証されないことを通知することができます。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. 参照してくださいで生成された値を追加詳細セクション。See Value generated on add section for more details.

生成された値を追加または更新 (Fluent API)Value generated on add or update (Fluent API)

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

警告

これにより、EF に通知を追加または更新されたエンティティの値が生成される、EF が実際の値を生成するメカニズムを設定することは保証されないことだけです。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. 参照してくださいで生成された値を追加または更新詳細セクション。See Value generated on add or update section for more details.