https://www.cnblogs.com/cuijl/p/6737815.html
基本 EF 配置只要配置实体类和表、字段的对应关系、表间关联关系即可。
如何利用 EF的高级配置,达到更多效果:如果数据错误(比如字段不能为空、字符串超长等),会在 EF 层就会报错,而不会被提交给数据库服务器再报错;如果使用自动生成数据库,也能帮助 EF 生成更完美的数据库表。这样的配置通过FluentAPI可以完成。
尽 量 用 约 定 , EF 配 置 越 少 越 好 。
- 配置属性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); }