zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/yangda/p/3358502.html
Copyright © 2011-2022 走看看