1. Entity Framework是Microsoft的ORM框架,随着 Entity Framework 不断的完善强化已经到达了EF 6.0+ 还是非常的完善的,目前使用的比例相对于其他ORM 的框架还是比较多的。例如有我们目前使用较多的是EF和Drapper 和SQL Sugar 以及NHibernate 当然NHibernate 我使用的不多。当然EF确实使用起来非常的方便开发的速度是比较快的,EF 毕竟在Microsoft 在.NET 体系中已经推出了多年了,无论是成熟度还是其中的性能以及优化的程度都得到了很好很大的改善, 所以还是非常值得我们学习使用,当然我这个不是吹嘘EF 好,而且有的朋友也说了 EF 性能不好效率不高,我想询问一下 针对于这些问题你想过如何进行优化 以及改进没有其实目前改进的方案网上还是非常多的,当然也有很多开发者为EF提供了扩展功能,如Entity Framework Extended 等里面封装的一些方法就是非常好使用的。而且作为.NET 开发者来说项目的通用性也是非常的强大的,资料也是非常多的,Microsoft在这块的更新力度也很给力。Entity Framework 提供了三种开发模式,Code Frist,Database-First,Model-First。 目前采用Code Frist 的比较多一些 ,但是我建议大家可以使用DB Frist 简单好用。操作方便。当然你如果你喜欢Code Frist 也是拥有自己的好处,反正三者之间 都是相通的,没有什么难点的。都是ORM 之间的转化。
Database-First模式明显性能会差点,非常的适合初学者,或者是比较急的中小型项目一般情况下使用还是足够的。(数据量200W左右还是足够应付的)。
Model-First模式优点是开发人员能够在设计模型时完全了解数据库的结构以及表格之间的关系,但是缺点是在模型设计完后,还是需要去手动创建数据库,而且生成的脚本有点不简洁。
Code-First模式有点不用说了,就是上面两个模式的缺点。缺点应该也是有很多的,比如更新数据库。涉及到数据的迁移这一块。就让大多数人比较头疼。目前解决的方案比较多。
这个这个只是我个人的意见和看法 。所以关于这个EF 的开发模式的如何的使用,决定权利在于你的项目和数据库数据量大小和你公司的目前存在的框架。
2. 关于我个人封装的通用的EF 比较简单好用就是正对于数据库的CRUD ,而且非常适合于单个数据库的读写的操作。 当然你也可以进行对于数据库进行读写分离的操作,建立相互对应的数据库的集群,那么其实说白了 EF本身就是一个对于CRUD 的读写的操作。使用过EF的人知道,EF提供访问数据库的是 DbContext 这个对象,所以想实现读写分离的就很简单了,只要在程序中使用两个不同的DbContext对象,一个负责读,一个负责写就好了。当然你也可以进行使用相对应的工厂化模式进行 读写分离的操作也可以通过 常用的反射来进行读写的操作,决定权取决在你的手上。所以我们在使用其中的读写分离的时候你只管进行对于 DbContext 进行操作就是了 建立相互对于的读写的类就可以了。 一般读写进行分离的都是进行同步于主库的。因为一般情况下的读写的分离 都是一主多从库的模式。
3.在使用这个通用EF CRUD 类的时候需要 进行添加EntityFramework.Extended.6.1.0.168 EntityFramework 6.1.3 两个程序集 。当然 我这里使用的是MySQL 数据库 所以还添加MySQL Data Entity 的等等。添加以上引用的程序集 就可以了。然后还需要添加相对应的Transaction的程序集,这个时候有的朋友就问了 添加Transaction做什么 我的目的就是通过建立想对应的事务来进行回滚 处理简单的并发 要做全部都做,要么全部都不做。如果你采用Queue 来进行解决并发那就更好了。其中关于EF 的CRUD 的通用代码如下。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq.Expressions; 4 using System.Data; 5 using MySql.Data.MySqlClient; 6 /************************************************ 7 ◇作者: LowKeyC 8 ◇说明: 定义一个EF通用的CRUD的接口 9 ◇版本号:V1.0 10 ◇创建日期:2017年6月22日 星期四 EFCommon.SqlHelp 14 { IRepository : IDisposable 16 { 添加实体 Add<T>(T Entity) where T : class; 批量的进行添加实体 AddRange<T>(List<T> Entity) where T : class; 删除单个实体 Delete<T>(T Entity) where T : class; 根据查询条件进行删除单个实体 Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class; 单个对象的修改 Update<T>(T Entity) where T : class; 批量修改 Update<T>(Expression<Func<T, bool>> WhereLambda, Expression<Func<T, T>> UpdateLambda) where T : class; 批量的修改 Update<T>(List<T> Entity) where T : class; 批量统一的进行更新 Update<T>(T model, Expression<Func<T, bool>> WhereLambda, params string[] ModifiedProNames) where T : class; 根据主键进行查询 T FindByID<T>(dynamic ID) where T : class; 默认查询选择第一条数据,没有那么进行返回NULL T GetFristDefault<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class; 查询所有的数据 List<T> GetAll<T>(string Order = null) where T : class; 含有带条件的查询 List<T> GetAllQuery<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class; 获取查询的数量 GetCount<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class; 判断对象是否存在 GetAny<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class; 根据查询过条件进行分页 List<T> Pagination<T, TKey>(int PageIndex, int PageSize, out int TotalCount, Expression<Func<T, TKey>> OrderBy, Expression<Func<T, bool>> WhereLambda = null, bool IsOrder = true) where T : class; 根据查询条件进行做分页查询 List<T> Pagination<T>(int PageIndex, int PageSize, out int TotalCount, string ordering, Expression<Func<T, bool>> WhereLambda = null) where T : class; 根据查询条件进行转化 List<T> GetSelect<T>(Expression<Func<T, bool>> WhereLambda) where T : class; 执行存储过程或自定义sql语句--返回集合 List<T> QueryPro<T>(string Sql, List<MySqlParameter> Parms, CommandType CmdType = CommandType.Text) where T : class; 回滚 RollBackChanges<T>() where T : class; 193 194 } 195 }
4.关于如何实现以上接口的方法。如下面代码所示。当然你也可以将进行实例化对象这里进行采用简单工厂 或者抽象工厂 全凭个人想法。