生成される値Generated Values

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

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

値を生成しません。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

生成された値に追加または更新プログラムが (insert または 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

規則では、整数または GUID データ型の主キーを追加で生成された値を持つセットアップとなります。By convention, primary keys that are of an integer or GUID data type 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.