EF4.1之覆盖EF的默认的约定

覆盖EF默认的约定可以通过两种方式:

 1、拦截模型构建器,使用流畅的API

 2、通过给 类添加标签

好的,我还用之前定义的订单类来做例子:

    public class Order
    {
        public int OrderId { set; get; }
        
        public string OrderCode { set; get; }
        
        public string CustormName { set; get; }
     }

模型构建器

使用构建器,就必须要重写 方法:OnModelCreating

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

         }

通过参数 modelbuilder进行修改其默认的约定:

            modelBuilder.Entity<Order>().ToTable("efdemo.Order");//效果同下
            modelBuilder.Entity<Order>().ToTable("Order", "efdemo");

上面执行的修改了表个架构,默认是根据登录的用户进行创建的数据库表的架构,sa 是dbo

下面是对表的属性就行修改:

1             modelBuilder.Entity<Order>().Property(o => o.OrderId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);//可以设置成 自动增长的(默认是自动增长的,可以取消)
2 
3             modelBuilder.Entity<Order>().Property(o => o.OrderCode).IsRequired()//不能为空
4                 .HasMaxLength(11)//设置最大长度
5                 .HasColumnName("OrderBM");//设置生成数据库中表 对应的 字段名
6             modelBuilder.Entity<Order>().Property(o => o.CustormName).IsRequired()
7                 .HasMaxLength(32);

使用标签

 1     public class Order
 2     {
 3         [Required]
 4         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 5         public int OrderId { set; get; }//默认的约定;EF 查找类里面时候还有 ID后 类名+ID字段,有就将其设置为主键
 6         [MaxLength(12)]
 7         public string OrderCode { set; get; }
 8         
 9         public string CustormName { set; get; }
10     }

最后进行总结一下,到底是应该使用哪一个,下面就行总结:

首先先论述各自的优点:

使用模型构建器:

优点:流畅的API,支持泛型委托:Lambda表达式,很爽。并且可以使用链式编程

             有智能提示,有编译时的错误检查

             纯粹的POCO,没有修改模型

使用 标签:

优点:简单明了,并且可以实现错误检查

但是他们也有的各自的不足,比如:

 1、使用标签不能对表名,表的架构进行修改

 2、使用构建器,不能对字段的 最小长度进行设置

 3、使用构建器,不能对字段的正则表达式进行设置

但是将构建器和标签结合起来就可以实现了,

所以我认为:

使用构建器约束数据类型,

使用标签来丰富我们的模型。

原文地址:https://www.cnblogs.com/xiaoxiaogogo/p/3419395.html