基本 EF 配置只要配置实体类和表、字段的对应关系、表间关联关系即可。

  如何利用 EF的高级配置,达到更多效果:如果数据错误(比如字段不能为空、字符串超长等),会在 EF 层就会报错,而不会被提交给数据库服务器再报错;如果使用自动生成数据库,也能帮助 EF 生成更完美的数据库表。这样的配置通过FluentAPI可以完成。

  尽 量 用 约 定 , EF 配 置 越 少 越 好 。

  1. 配置属性Length:

  Length用来描述数组的长度,当前包括string和Byte数组。

  默认约定:Code First对string或byte数组的默认长度约定是max。注意:Sql Server Compact中默认最大数组长度是4000。

  重写约定:使用HasMaxLength(nn),参数为可空整数。

Property(t => t.Name).HasMaxLength();

备注

如 果 插 入 一 个 Person 对 象 , Name 属 性 的 值 非 常 长 , 保 存 的 时 候 就 会 报DbEntityValidationException 异常,这个异常的 Message 中看不到详细的报错消息,要看EntityValidationErrors 属性的值。

var p = new Person();
p.Name = "非常长的字符串";
ctx.Persons.Add(p);
try
{
ctx.SaveChanges();
}
catch(DbEntityValidationException ex)
{
StringBuilder sb = new StringBuilder();
foreach(var ve in ex.EntityValidationErrors.SelectMany(eve=>eve.ValidationErrors))
{
sb.AppendLine(ve.PropertyName+":"+ve.ErrorMessage);
}
Console.WriteLine(sb);
}

  2. 配置DataType:

  Data Type表示将.NET类型映射到的数据库的数据类型。

  默认约定:列的数据类型由使用的数据库提供程序决定。以SQL Server为例: String->nvarchar(max),Integer->int,Byte[]->varbinary(max),Boolean->bit。

  3. 配置是否为空

  默认约定:主键属性不允许为空,引用类型(String,array)允许为空,值类型(所有的数字类型,Datetime,bool,char)不允许为空,可空的值类型Nullable<T>允许为空。

  重写约定:使用IsRequired()配置不允许为空,使用IsOptional()配置允许为空。

  this.Property(p => p.Name).IsRequired() 属性不能为空;

  this.Property(p => p.Name).IsOptional() 属性可以为空;

  基于“尽量少配置”的原则:如果属性是值类型并且允许为null,就声明成 long?等,否则声明成 long 等;如果属性属性值是引用类型,只有不允许为空的时候设置 IsRequired()。

  4. 不常用的属性

  a)  主键: this.HasKey(p => p.Id);

  b)  某个字段不参与映射数据库: this.Ignore(p => p.Name1);

  c)  this.Property(p => p.Name).IsFixedLength(); 配置属性固定长度;IsMaxLength(),配置属性为数据库提供程序允许的最大长度。

  d)  this.Property(p => p.Name).IsUnicode(false) 对应的数据库类型是 varchar 类型,而不是nvarchar

  e)  this.Property(p => p.Id).HasColumnName("Id"); Id 列对应数据库中名字为 Id 的字段

  f)  this.Property(p  =>p.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity) 指定字段是自动增长类型。

public UserConfig() {

            ToTable("T_Users");

            HasRequired(u => u.City).WithMany().HasForeignKey(u => u.CityId).WillCascadeOnDelete(false);

            Property(p => p.PasswordHash).IsRequired().HasMaxLength();

            Property(p => p.PasswordSalt).IsRequired().HasMaxLength();

            Property(p => p.PhoneNum).IsRequired().HasMaxLength().IsUnicode(false);

        }

FluentAPI配置的更多相关文章

  1. EF CodeFirst系列(7)---FluentApi配置存储过程

    FluentApi配置存储过程 1.EF自动生成存储过程 EF6的CodeFirst开发模式支持给实体的CUD操作配置存储过程,当我们执行SaveChanges()方法时EF不在生成INSERT,UP ...

  2. EF CodeFirst系列(8)--- FluentApi配置单个实体

    我们已经知道了在OnModelCreating()方法中可以通过FluentApi对所有的实体类进行配置,然而当实体类很多时,我们把所有的配置都放在OnModelCreating()方法中很难维护.E ...

  3. Code First 关系配置整理

    之前EF一直有性能问题以及使用便利性问题, 终于到了EF6有了Migrations之后, 小弟也决定加入EF阵营了. 在学习FluentAPI配置关系的时候, 发现网上的好几个教程实际上博主自己都没有 ...

  4. Entity Framework 5.0系列之约定配置

    Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的, ...

  5. 使用Fluent API 配置/映射属性和类型

    Code First约定-Fluent API配置 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code F ...

  6. Entity Framework 关系约束配置

    前言 简单的说一下自己的理解,大家应该都很明白ADO.NET,也就是原生态的数据库操作,直接通过拼接SQL语句,表与表之间通过链接(inner join  left join  或者子查询),也就是在 ...

  7. Code First约定-Fluent API配置

    转自:http://blog.163.com/m13864039250_1/blog/static/2138652482015283397609/ 用Fluent API 配置/映射属性和类型 简介 ...

  8. 【转】Entity Framework 5.0系列之约定配置

    Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的, ...

  9. EF CodeFirst系列(6)---配置1对1,1对多,多对多关系

    这一节介绍EF CodeFirst模式中的1对0/1,1对多,多对多关系的配置,只有梳理清楚实体间的关系,才能进行愉快的开发,因此这节虽然很简单但是还是记录了一下. 1. 1对0/1关系配置 1. 通 ...

随机推荐

  1. Android入门知识

    1.Android开发环境 Android常用的开发环境包括两个:Eclipse + ADT 和Android Studio,Android Studio作为google官方推出的开发环境自然有得天独 ...

  2. C++的Matlab接口

    与 原文 过程有些不同,根据具体环境自行配置即可! 转自于:http://blog.csdn.net/left_la/article/details/8206645 我的计算机环境是win7 64位系 ...

  3. Eigen库对齐问题:declspec(align('16')) 的形参将不被对齐

    一:错误提示:error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned 英文提示:erro ...

  4. eclipse tomcat发布路径在哪?

  5. Javase范式

    package Xwxx; import java.util.ArrayList; import java.util.Iterator; import java.util.function.IntBi ...

  6. 【转载】springboot注解

    https://blog.csdn.net/yitian_66/article/details/80866571 springboot注解:@Service: 注解在类上,表示这是一个业务层bean@ ...

  7. Bash 如何取得当前正在执行的脚本的绝对路径?

    转自:http://blogread.cn/it/article/6549?f=wb Bash 如何取得当前正在执行的脚本的绝对路径? 如题,一般我们写Shell脚本的时候,都倾向使用绝对路径,这样无 ...

  8. IOS - xib(Interface Builder,view) - can't change view size(view不能改变大小问题)

    很多时候,我们自定义tableview.collectionview的cell,也有时候我们要自定义窗口xib,但创建xib后,其height.width不可修改. 这时问题就来了,怎么才能使我们的自 ...

  9. 【JavaScript框架封装】实现一个类似于JQuery的基础框架、事件框架、CSS框架、属性框架、内容框架、动画框架整体架构的搭建

    /* * @Author: 我爱科技论坛 * @Time: 20180715 * @Desc: 实现一个类似于JQuery功能的框架 * V 1.0: 实现了基础框架.事件框架.CSS框架.属性框架. ...

  10. Problem 5

    Problem 5 # Problem_5.py """ 2520 is the smallest number that can be divided by each ...