覆盖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

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

             modelBuilder.Entity<Order>().Property(o => o.OrderId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);//可以设置成 自动增长的(默认是自动增长的,可以取消)

             modelBuilder.Entity<Order>().Property(o => o.OrderCode).IsRequired()//不能为空
.HasMaxLength()//设置最大长度
.HasColumnName("OrderBM");//设置生成数据库中表 对应的 字段名
modelBuilder.Entity<Order>().Property(o => o.CustormName).IsRequired()
.HasMaxLength();

使用标签

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

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

首先先论述各自的优点:

使用模型构建器:

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

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

纯粹的POCO,没有修改模型

使用 标签:

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

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

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

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

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

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

所以我认为:

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

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

EF4.1之覆盖EF的默认的约定的更多相关文章

  1. 修改EF的默认约定模型的方式

    EF默认使用约定的模型,但是有时类不遵从约定,我们需要能够执行进一步的配置.对此有两种方法:数据注释和Fluent API 注释 class User { [Key] public int Key{ ...

  2. EF的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

    I.EF的默认映射 上节我们创建项目,通过定义实体类就可以自动生成数据库,并且EF帮我们自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF的默认映射.具体分为: 数据库映射:Code Fi ...

  3. springboot项目中如何在pom文件覆盖starter中默认指定的jar版本号

    分两种情况: 1.项目继承自spring-boot-starter-parent  通过定义properties的方式改变starter中的默认版本 <!-- Inherit defaults ...

  4. How to: Initialize Business Objects with Default Property Values in Entity Framework 如何:在EF中用默认属性值初始化业务对象

    When designing business classes, a common task is to ensure that a newly created business object is ...

  5. 修改 EF的默认连接工厂为 Sql Server 而不是LocalDb

      当你用EF6创建一个新项目,不知你是否注意到默认的连接字符串使用了LocalDb而不是SQLServer.但你如果想把默认连接改用SQLSErver而不是LocalDb.这个其实很简单:只需修改下 ...

  6. 局部覆盖element-ui的默认样式

    最近项目中遇到的问题,只想在某个页面里面单独更改element-ui的样式,而不影响全局 有两种方法: 1.在需要更改的组件里新增一个style标签[重点:不要加scoped],然后直接获取class ...

  7. 如何局部覆盖element-ui的默认样式

  8. 第8条:覆盖equals时遵守通用约定

    如果不需要覆盖equals方法,那么就无需担心覆盖equals方法导致的错误. 什么时候不需要覆盖equals方法? 1.类的每个实例本质上是唯一的. 例如对于Thread,Object提供的equa ...

  9. Effective Java —— 覆盖equals时遵守通用约定

    本文参考 本篇文章参考自<Effective Java>第三版第十条"Obey the general contract when overriding equals" ...

随机推荐

  1. [改善Java代码]断言绝对不是鸡肋

    建议19: 断言绝对不是鸡肋 在防御式编程中经常会用断言(Assertion)对参数和环境做出判断,避免程序因不当的输入或错误的环境而产生逻辑异常,断言在很多语言中都存在,C.C++.Python都有 ...

  2. Jersey(1.19.1) - Root Resource Classes

    Root resource classes are POJOs (Plain Old Java Objects) that are annotated with @Path have at least ...

  3. HttpClient(4.3.5) - HTTP Entity

    HTTP entity HTTP messages can carry a content entity associated with the request or response. Entiti ...

  4. Redis 命令 - Connection

    AUTH password Authenticate to the server More: http://redis.io/commands/auth, http://www.redis.cn/co ...

  5. Nginx - Additional Modules, Content and Encoding

    The following set of modules provides functionalities having an effect on the contents served to the ...

  6. C# 计算文件的 Hash 值

    /// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...

  7. Android之文字点击链接

    定义textView1和textView2并获得组件. String html = "<font color='red'></font>"; html += ...

  8. Access和Sql区别

    假设表game有一字段为gameYuiJian为bit字段(SQL SERVER 20005)和"是/否"字段(ACCSS数据库),在编写脚本文件时,如下才能正确执行 SQL st ...

  9. .Net 微信开发与微信支付

    .NET     https://github.com/JeffreySu/WeiXinMPSDK JAVA   http://git.oschina.net/pyinjava/fastweixin ...

  10. VBA 将 ANSI 转换为 UTF-8文件

    在使用的时候,先用WriteOut生成一个临时文件(UTF-8带BOM),然后用Convert2utf8将BOM头的前三个字节删除. --------------------------------- ...