FluentAPI配置

  基本 EF 配置只要配置实体类和表、字段的对应关系、表间关联关系即可。

  如何利用 EF的高级配置,达到更多效果:如果数据错误(比如字段不能为空、字符串超长等),会在 EF 层就会报错,而不会被提交给数据库服务器再报错;如果使用自动生成数据库,也能帮助 EF 生成更完美的数据库表。这样的配置通过FluentAPI可以完成。

  尽 量 用 约 定 , EF 配 置 越 少 越 好 。

  1. 配置属性Length:

  Length用来描述数组的长度,当前包括string和Byte数组。

  默认约定:Code First对string或byte数组的默认长度约定是max。注意:Sql Server Compact中默认最大数组长度是4000。

  重写约定:使用HasMaxLength(nn),参数为可空整数。

Property(t => t.Name).HasMaxLength(50);

备注

如 果 插 入 一 个 Person 对 象 , Name 属 性 的 值 非 常 长 , 保 存 的 时 候 就 会 报DbEntityValidationException 异常,这个异常的 Message 中看不到详细的报错消息,要看EntityValidationErrors 属性的值。

var p = new Person();
p.Name = "非常长的字符串";
ctx.Persons.Add(p);
try
{
    ctx.SaveChanges();
}
catch(DbEntityValidationException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach(var ve in     ex.EntityValidationErrors.SelectMany(eve=>eve.ValidationErrors))
    {
        sb.AppendLine(ve.PropertyName+":"+ve.ErrorMessage);
    }
Console.WriteLine(sb);
}    

  2. 配置DataType:

  Data Type表示将.NET类型映射到的数据库的数据类型。

  默认约定:列的数据类型由使用的数据库提供程序决定。以SQL Server为例: String->nvarchar(max),Integer->int,Byte[]->varbinary(max),Boolean->bit。

  3. 配置是否为空

  默认约定:主键属性不允许为空,引用类型(String,array)允许为空,值类型(所有的数字类型,Datetime,bool,char)不允许为空,可空的值类型Nullable<T>允许为空。

  重写约定:使用IsRequired()配置不允许为空,使用IsOptional()配置允许为空。

  this.Property(p => p.Name).IsRequired() 属性不能为空;

  this.Property(p => p.Name).IsOptional() 属性可以为空;

  基于“尽量少配置”的原则:如果属性是值类型并且允许为null,就声明成 long?等,否则声明成 long 等;如果属性属性值是引用类型,只有不允许为空的时候设置 IsRequired()。

  4. 不常用的属性

  a)  主键: this.HasKey(p => p.Id);

  b)  某个字段不参与映射数据库: this.Ignore(p => p.Name1);

  c)  this.Property(p => p.Name).IsFixedLength(); 配置属性固定长度;IsMaxLength(),配置属性为数据库提供程序允许的最大长度。

  d)  this.Property(p => p.Name).IsUnicode(false) 对应的数据库类型是 varchar 类型,而不是nvarchar

  e)  this.Property(p => p.Id).HasColumnName("Id"); Id 列对应数据库中名字为 Id 的字段

  f)  this.Property(p  =>p.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity) 指定字段是自动增长类型。

public UserConfig() {

            ToTable("T_Users");

            HasRequired(u => u.City).WithMany().HasForeignKey(u => u.CityId).WillCascadeOnDelete(false);

            Property(p => p.PasswordHash).IsRequired().HasMaxLength(100);

            Property(p => p.PasswordSalt).IsRequired().HasMaxLength(20);

            Property(p => p.PhoneNum).IsRequired().HasMaxLength(20).IsUnicode(false);

        }

 

 

posted @ 2017-04-20 11:28 大胖儿在努力 阅读(...) 评论(...) 编辑 收藏