生成的值

值生成模式

有三种可用于属性的值生成模式:

  • No value generation (无值生成)
  • Value generated on add (添加时生成)
  • Value generated on add or update (添加或更新时生成)

无值生成

没有值生成意味着您将始终提供要保存到数据库的有效值。 此有效值必须在添加到上下文之前分配给新实体.
如果约定将属性配置为值生成,则禁用属性上的值生成通常是必要的。 例如,如果您有int类型的主键,它将被隐式设置为在添加时生成值;您可以通过以下方式禁用它:

数据注释(data-annotations)

public class User
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int UserId { get; set; }
public string Name { get; set; }
public DateTime BrithDate {get;set;}
}

Fluent Api

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>(b => {
        b.ToTable("Users");
        b.Property(u => u.UserId).ValueGeneratedNever();
    });
}

添加时生成值

在添加时生成的值意味着为新实体自动生成一个值。
根据所使用的数据库提供者的不同,值可以由EF或数据库中的客户端生成。
如果该值是由数据库生成的,那么EF可以在将实体添加到上下文时分配临时值。
然后,在SaveChanges()期间,此临时值将被数据库生成的值替换。
如果将一个实体添加到分配给该属性的值的上下文中,那么EF将尝试插入该值,而不是生成一个新的值。
如果一个属性没有分配 CLR 默认值(如字符串 NULL,int 0,Guid Guid.Empty等),则该属性被认为已赋值.)。 有关更多信息,请参见生成属性的显式值。

按照约定,如果应用程序不提供值,则将 short、int、long 或 Guid 类型的非复合主键设置为插入的实体生成值。

数据注释(data-annotations)

public class User
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string Name { get; set; }
public DateTime BrithDate {get;set;}
}

Fluent Api

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>(b => {
        b.ToTable("Users");
        b.Property(u => u.UserId).ValueGeneratedOnAdd();
    });
}

添加或更新时生成值

添加或更新时生成值,意味着在每次保存该记录(插入或更新)时生成新值。
与添加时生成值一样,如果为新添加的实体实例的属性指定值,则将插入该值,而不是要生成的值。 还可以在更新时设置显式值。 有关详细信息,请参阅生成的属性的显式值。

默认值

在关系数据库上,可以用默认值配置列;如果插入的行没有该列的值,则将使用默认值。
可以在属性上配置默认值:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Rating)
        .HasDefaultValue(3);
}

您还可以指定用于计算默认值的SQL片段:

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


数据注释(data-annotations)

.. code:: csharp

   public class User
   {
   [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
   public int UserId { get; set; }
   public string Name { get; set; }
   public DateTime BrithDate {get;set;}
   }

Fluent Api

.. code:: csharp

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
   modelBuilder.Entity<User>(b => {
           b.ToTable("Users");
           b.Property(u => u.UserId).ValueGeneratedOnAddOrUpdate();
       });
   }

计算列

神通数据库暂不支持计算列功能