3.1 创建模型-实体属性

属性的优先级

特性(称为数据注释)应用于类和属性。 数据注释会替代约定,但会被 Fluent API 配置替代,也就是OnModelCreating 里面的等级最高; 下面的例子一般会使用两种模式都写一遍;

修改字段数据类型

比如今天写了2个byte类型的字段,需要把字段属性修改为 tinyint 还是需要修改的

//注解模式
public class Blog
{
   public int BlogId { get; set; }
   [Column(TypeName = "varchar(200)")]
   public string Url { get; set; }

   [Column(TypeName = "decimal(5, 2)")]
   public decimal Rating { get; set; }
}

// Fluent  API模式
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   modelBuilder.Entity<Blog>(eb =>
    {
        eb.Property(b => b.Url).HasColumnType("varchar(200)");
        eb.Property(b => b.Rating).HasColumnType("decimal(5, 2)");
    });
}

修改列的默认值

在关系数据库中,可以使用默认值来配置列;如果插入的行没有该列的值,将使用默认值。

可以在属性上配置默认值:

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

修改列的最大长度

public class Blog
{
    public int BlogId { get; set; }
    [MaxLength(500)]
    public string Url { get; set; }
}

//API模式修改
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)      
        .HasMaxLength(500);
}

精度和小数位

decimal 属性,精度定义表示列将包含的任何值所需的最大位数,而 scale 定义所需的最大小数位数。 对于 DateTime 属性,精度定义表示秒的小数部分所需的最大位数,并且不使用小数位数

在将数据传递给提供程序之前,实体框架不会进行任何精度验证或缩放。 根据需要验证提供程序或数据存储。 例如,如果以 SQL Server 为目标,则数据类型为的列 datetime 不允许设置精度,而一个列的 datetime2 精度介于0到7(含)之间。

在下面的示例中, Score 将属性配置为具有精度14和小数位数2将导致 decimal(14,2) 在 SQL Server 上创建类型为的列,并且 LastUpdated 将属性配置为具有精度3将导致类型为的列 datetime2(3)

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Score)
        .HasPrecision(14, 2);

    modelBuilder.Entity<Blog>()
        .Property(b => b.LastUpdated)
        .HasPrecision(3);
}

必需属性和可选属性

按照约定,把可以包含null值的列定义为可选列,不允许包含null值的定为必填列;

比如 int ,bool decimal 都是必须填列;

//注解模式
public class Blog
{
    public int BlogId { get; set; }
    [Required]
    public string Url { get; set; }
}

// API模式
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .IsRequired();
}

另外还有? 为null的引用类型不关注。

包含和排除属性

//注解模式
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    [NotMapped]
    public DateTime LoadedFromDatabase { get; set; }
}
//API 模式
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Ignore(b => b.LoadedFromDatabase);
}

给列起别名

按照约定,使用关系型数据库的时候,实体属性映射到与属性同名的表列。若是希望使用不同的名称配置列,可以使用下面的代码片段

//注解模式
public class Blog
{
    [Column("blog_id")]
    public int BlogId { get; set; }
    public string Url { get; set; }
}

//API 模式
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.BlogId)
        .HasColumnName("blog_id");
}
原文地址:https://www.cnblogs.com/maanshancss/p/13360371.html