随笔分类 - 4.Entity Framework
摘要:上篇文章介绍了ValidationAttribute和IValidatableObject.Validate验证,但是这种验证还是稍微简单了,对于复杂的实体,例如:继承过来的实体、实现某接口的实体等等,简单的验证就无能为力了。这里重写ValidateEntity方法可以实现更为复杂的验证。ValidateEntity本身是虚方法(virtual),故可以重写此方法加上自己的验证逻辑。在引入:System.Data.Entity.Infrastructure、System.Data.Entity.Validation、System.Collections.Generic三个命名空间的前提下,直接
阅读全文
摘要:之前的Code First系列文章已经演示了如何使用Fluent API和Data Annotation的方式配置实体的属性,比如配置Destination类的Name属性长度不大于50等。本文介绍EF里更强大的Validation API达到实体属性验证的效果。主要是通过ValidationAttributes属性和IValidatebleObject接口来进行的验证。一、实体属性的简单验证(GetValidationResult方法)修改person类LastName属性不超过10个字符: [MaxLength(10)] public string LastNa...
阅读全文
摘要:本文目录查看实体当前、原始和数据库值:DbEntityEntry查看实体的某个属性值:GetValue方法拷贝DbPropertyValues到实体:ToObject方法修改DbPropertyValues当前值:索引器克隆实体:Clone方法设置实体的值:SetValues方法克隆实体:SetValues获取和设置实体的单个属性:Property方法查询实体的属性是否被修改:IsModified方法修改导航属性重新加载实体:Reload方法读取相关联的实体和状态:DbContext.ChangeTracker.Entries方法EF里如何解决更新时的冲突重写上下文的SaveChanges方法
阅读全文
摘要:本文目录使用EntityState枚举实现单个实体的增/删/改增加:DbSet.Add = > EntityState.Added标记实体为未改变:EntityState.Unchanged修改:EntityState.Modified删除:DbSet.Remove = > EntityState.DeletedEF里实体状态的递归(recursive)不被上下文追踪的情况下实现增删改操作让实体实现自定义的IObjectWithState接口来设置实体状态通用的转换实体状态方法本文源码和系列文章目录之前使用EF都是通过调用SaveChanges方法把增加/修改/删除的数据提交到数据
阅读全文
摘要:本文目录EF对单个实体的增查改删增加单个实体查询单个实体修改单个实体删除单个实体EF里主从表关联数据的各种增删改查增加(增加从表数据、增加主从表数据)查询(查询导航属性为集合、查询导航属性为单个对象)修改(修改从表的外键)删除(删除主从表关系、删除主表数据、删除主从表数据、修改从表数据外键)补充内容SaveChanges方法提交多次操作DbSet.Add方法返回当前实体源码和系列文章导航注:本章节多次演示了各种删除,若要重复查看效果,需解开注释初始化数据的方法。一、EF对单个实体的增查改删增加单个实体: /// /// 增加单个实体 /// ...
阅读全文
摘要:对于之前一直使用webForm服务器控件、手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措。本系列文章可以帮助新手入门并熟练使用EF和MVC,有了这个基础以后再学习后续新版的EF以及MVC,自然简单许多了。祝好运! 一、EF Code First
阅读全文
摘要:之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库。老版本的EF主要是通过ObjectContext来操作数据库的,一看是Object打头的,自然相当庞大,方法也比较多。到了经典的4.1版本,EF小组推出了一些更简单好用的API,就是DbContext,它包括更常用的方法。看看EF小组是怎么说的,原话:The Entity Framework 4.1 release also included another important feature, called the Db
阅读全文
摘要:本章节讲解EF里的继承映射关系,分为TPH、TPT、TPC。具体:1.TPH:Table Per Hierarchy这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discriminator列用来区分基类和子类的数据。新建一个度假村Resort实体类试试: /// /// 度假村类 /// public class Resort : Lodging //这里继承了Lodging类 { public string Entertainment { get; set; } //娱乐 public string A...
阅读全文
摘要:本章节开始了解EF的各种关系。如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解。I.实体间一对一的关系添加一个PersonPhoto类,表示用户照片类 /// /// 用户照片类 /// public class PersonPhoto { [Key] public int PersonId { get; set; } public byte[] Photo { get; set; } public string Caption { get; set; } //标题 ...
阅读全文
摘要:通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西。文章的开头提示下:提供的demo为了后面演示效果,前面代码有些是注释了的,请按照文章讲解的顺序先后释放注释并运行查看效果。I.EF里Guid类型数据的自增长现在新添加一个Trip旅行类: /// /// 旅行类 /// public class Trip { public Guid Identifier { get; set; } public DateTime StartDate { get; ...
阅读全文
摘要:I.EF里的默认映射上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库的主键、外键以及表名和字段的类型等,这就是EF里的默认映射。具体分为:数据库映射:Code First 默认会在本地的SQL Expression数据库中建立一个和DbContext的子类的全名相同的数据库,全名指的是命名空间加上类名;表映射:Code First 默认会按照类型名复数建立数据表,比如说Destination类对应的表名就叫Destinations;列映射:Code First 默认会按照类中的属性名建立column,它还有默认的数据类型映射习惯,int会映射为interger,str
阅读全文
摘要:Code First 顾名思义就是先代码,再由代码生成数据库的开发方式。废话不多说,直接来一发看看:在VS2010里新建一个空白解决方案,再依次添加两个类库项目:Model、DataAccess和一个控制台项目BreakAwayConsole。分别是实体、数据访问、控制台显示。项目结构图:详细介绍:1.实体类Model本类库下有两个类:Lodging(住宿类)、Destination(景点类)Lodging类定义: /// /// 住宿类 /// public class Lodging { public int LodgingId { get; set;...
阅读全文