EF6.0 自定义Code First约定
自定义Code First约定有三种方式,分别是:Lightweight Conventions(轻量级约定)、Configuration Conventions(配置型约定)、Model-based Conventions(基于模型的配置)。
Lightweight Conventions:
这是一种轻量级的约定,可以直接重写DbContext的OnModelCreating方法来实现约定,如下:
public class BaseDbContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Types().Configure(f => f.ToTable("cms_" + f.ClrType)); //轻松为数据表名设定生成规则 } }
Lightweight Conventions是最简单的实现方式,大部分的全局配置需求都能够以这种方式来实现。
Configuration Conventions:
自定义Conventions,只需要继承Convention,再重写DbContext的OnModelCreating方法,添加一个Convention即可。
1 public class StringMaxLengthConvertion : Convention 2 { 3 /// <summary> 4 /// 构造函数 5 /// </summary> 6 public StringMaxLengthConvertion() 7 { 8 this.Properties().Having(p=>(ColumnLengthAttribute)p.GetCustomAttributes(typeof(ColumnLengthAttribute),true).FirstOrDefault()).Configure((c,a)=>c.HasColumnName(a.ColumnName).HasMaxLength(a.ColumnMaxLength)); 9 } 10 } 11 12 public class TestDbContext : DbContext 13 { 14 protected override void OnModelCreating(DbModelBuilder modelBuilder) 15 { 16 modelBuilder.Conventions.Add<StringLengthAttributeConvention>(); 17 } 18 }
Configuration Conventions实现起来相对繁琐了一点,但是自由度也更高。
IConfigurationConvention接口有两个类型参数:TMemberInfo和TConfiguration。它们用来过滤你想自定义约定的模型元素。
第一个类型参数,TMemberInfo,可以是一下两个值:
-
Type(System)
-
PropertyInfo(System.Reflection)
第二个类型参数,TConfiguration,可以是一下任意一种。
-
ModelConfiguration (System.Data.Entity.ModelConfiguration.Configuration)
-
EntityTypeConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Types)
-
PropertyConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Properties)
-
NavigationPropertyConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation)
-
PrimitivePropertyConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive)
-
DateTimePropertyConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive)
-
DecimalPropertyConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive)
-
LengthPropertyConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive)
-
BinaryPropertyConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive)
-
StringPropertyConfiguration (System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive)
-
-
注意,Type和PropertyConfiguration(以及它的子类)不能混用,否则Configuration Conventions将不会生效。
增加自定义的Data Annotation
利用Custom Code First Conventions,我们还可以扩展自己的Data Annotation。例如,增加一个EmailAttribute特性,然后在Lightweight Conventions或者Configuration Conventions中,判断属性是否应用了EmailAttribute特性;如果是,则将列名映射为“Email”,列类型映射为“nvarchar(255)”, 达到了[Column("Email")]和[MaxLength(255)]共同作用的效果。
更详细的信息,请参考http://msdn.microsoft.com/en-us/data/jj819164.aspx