DatabaseGenerated 属性

指定数据库如何为属性生成值。有三个可能的值:

  1. None 指定数据库不生成值。
  2. Identity 指定该列是标识列 ,通常用于整数主键。
  3. Computed 指定数据库生成列的值。

如果该值不是 None,则 Entity Framework 不会将对该属性所做的更改提交回数据库。

默认情况下(基于 StoreGeneratedIdentityKeyConvention ),整数键属性将被视为标识列。要覆盖此约定并强制将其视为非标识列,可以使用值为 NoneDatabaseGenerated 属性。

using System.ComponentModel.DataAnnotations.Schema;

public class Foo
{
    [Key]
    public int Id { get; set; } // identity (auto-increment) column
}

public class Bar
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; } // non-identity column
}

以下 SQL 创建一个包含计算列的表:

CREATE TABLE [Person] (
    Name varchar(100) PRIMARY KEY,
    DateOfBirth Date NOT NULL,
    Age AS DATEDIFF(year, DateOfBirth, GETDATE())
)
GO

要创建用于表示上表中记录的实体,你需要使用值为 ComputedDatabaseGenerated 属性。

[Table("Person")]
public class Person
{
    [Key, StringLength(100)]
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public int Age { get; set; }
}