• 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

  • 相关阅读:
    ASPNETDB 数据库关系图、表和视图 基本表和独立表(转载)
    Android工作学习笔记之图片自适应imageview属性android:scaleType
    Android 为不同的语言和硬件创建资源
    asp.net mvc 将Enum绑定在DropDownList了
    java异常处理的throw和throws的区别
    media=screen是什么意思 有什么用?
    javascript 匿名函数
    CharSequence类型
    android使用系统资源,链接当前主题中的Style
    Android中this.*与*.this还有*.class的区别是什么?
  • 原文地址:https://www.cnblogs.com/yangda/p/3358502.html
Copyright © 2020-2023  润新知