生成された値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 の既定値 (for、for、for など) が割り当てられていない場合、プロパティには値が割り当てられていると見なされ null string 0 int Guid.Empty Guid ます。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

追加時に生成される値Value generated on add

慣例として、short、int、long、または Guid 型の非複合主キーは、値がアプリケーションによって提供されていない場合、挿入されたエンティティに対して値が生成されるように設定されます。By convention, non-composite primary keys of type short, int, long, or Guid are set up to have values generated for inserted entities, if a value isn't provided by the application. 通常、データベースプロバイダーは必要な構成を行います。たとえば、SQL Server の数値主キーは、ID 列として自動的に設定されます。Your database provider typically takes care of the necessary configuration; for example, a numeric primary key in SQL Server is automatically set up to be an IDENTITY column.

挿入されたエンティティに対して値が生成されるようにプロパティを構成するには、次のようにします。You can configure any property to have its value generated for inserted entities as follows:

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.

既定の値Default values

リレーショナルデータベースでは、既定値を使用して列を構成できます。その列の値を指定せずに行が挿入されると、既定値が使用されます。On relational databases, a column can be configured with a default value; if a row is inserted without a value for that column, the default value will be used.

プロパティの既定値を構成できます。You can configure a default value on a property:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Rating)
        .HasDefaultValue(3);
}

既定値の計算に使用される SQL フラグメントを指定することもできます。You can also specify a SQL fragment that is used to calculate the default value:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Created)
        .HasDefaultValueSql("getdate()");
}

既定値を指定すると、プロパティは、追加時に生成される値として暗黙的に構成されます。Specifying a default value will implicitly configure the property as value generated on add.

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

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.

計算列Computed columns

一部のリレーショナルデータベースでは、データベース内の値を計算するように列を構成できます。通常は、他の列を参照する式を使用します。On some relational databases, a column can be configured to have its value computed in the database, typically with an expression referring to other columns:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .Property(p => p.DisplayName)
        .HasComputedColumnSql("[LastName] + ', ' + [FirstName]");
}

注意

場合によっては、列の値がフェッチされるたび ( 仮想 列とも呼ばれます) に計算され、それ以外の場合は、行のすべての更新で計算され、格納されます ( 保存さ れた列 または保存 された列とも呼ばれます)。In some cases the column's value is computed every time it is fetched (sometimes called virtual columns), and in others it is computed on every update of the row and stored (sometimes called stored or persisted columns). これは、データベースプロバイダーによって異なります。This varies across database providers.

値の生成なしNo value generation

プロパティの値生成を無効にすることは、通常、規則によって値の生成用に構成される場合に必要です。Disabling value generation on a property is typically necessary if a convention configures it for value generation. たとえば、int 型の主キーがある場合、それは暗黙的に add によって生成される値として設定されます。これは、次の方法で無効にできます。For example, if you have a primary key of type int, it will be implicitly set configured as value generated on add; you can disable this via the following:

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