EF框架

我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能。以往用过一些ORM方法,尽管有代码生成器,但代码量总的来说比较多。这次采用EF,我就想,能不能尽量写出一些通用的方法,以后添加表、实体类,只需做很少的改动,就能拥有基本的增删改查功能呢?

方案如下:

1、分为几个部分:BLL、DAL、Model、Interface。其中,EF生成的代码放在Model。因为不想由BLL直接操作Model,因此还是增加一个DAL,由它来对EF的方法作进一步的封装,供BLL调用。至于接口,则是出于如下考虑:增删改查,BLL和DAL都需要实现,因此它们最好实现同一接口;最重要的,因为使用了接口,在BLL中,方便调用DAL对象。

这几个部分分别介绍如下:

1、接口Interface

[csharp] view plain copy

  1. public interface IEntity
  2. {
  3. long _ID { get;}
  4. }

[csharp] view plain copy

  1. public interface ICommon<T> where T : class,IEntity
  2. {
  3. T Add(T model);
  4. T Update(T model);
  5. void Delete(T model);
  6. //按主键删除,keyValues是主键值
  7. void Delete(params object[] keyValues);
  8. //keyValues是主键值
  9. T Find(params object[] keyValues);
  10. List<T> FindAll();
  11. }

2、DAL

通用的增删改查代码:

[csharp] view plain copy

  1. public abstract class BaseCommon<T> : Interface.ICommon<T> where T : class,Interface.IEntity
  2. {
  3. DbContext db;
  4. public BaseCommon(DbContext context)
  5. {
  6. this.db = context;
  7. }
  8. public DbContext Context
  9. {
  10. get
  11. {
  12. return db;
  13. }
  14. }
  15. #region ICommon<T>
  16. public T Add(T model)
  17. {
  18. db.Set<T>().Add(model);
  19. db.SaveChanges();
  20. return model;
  21. }
  22. public T Update(T model)
  23. {
  24. if (db.Entry<T>(model).State == EntityState.Modified)
  25. {
  26. db.SaveChanges();
  27. }
  28. else if (db.Entry<T>(model).State == EntityState.Detached)
  29. {
  30. try
  31. {
  32. db.Set<T>().Attach(model);
  33. db.Entry<T>(model).State = EntityState.Modified;
  34. }
  35. catch (InvalidOperationException)
  36. {
  37. T old = Find(model._ID);
  38. db.Entry(old).CurrentValues.SetValues(model);
  39. }
  40. db.SaveChanges();
  41. }
  42. return model;
  43. }
  44. public void Delete(T model)
  45. {
  46. db.Set<T>().Remove(model);
  47. db.SaveChanges();
  48. }
  49. public void Delete(params object[] keyValues)
  50. {
  51. T model = Find(keyValues);
  52. if (model != null)
  53. {
  54. db.Set<T>().Remove(model);
  55. db.SaveChanges();
  56. }
  57. }
  58. public T Find(params object[] keyValues)
  59. {
  60. return db.Set<T>().Find(keyValues);
  61. }
  62. public List<T> FindAll()
  63. {
  64. return db.Set<T>().ToList();
  65. }
  66. #endregion
  67. }

这里面,已经封装好了一般的增删改查方法。而对应数据库每个表对象的那些类,只需继承这个BaseCommon类,即可拥有增删改查功能。如:

[csharp] view plain copy

  1. public partial class TableA : BaseCommon<Model.TableA> { }

这样,TableA对象会自然拥有增删改查功能。假如需要扩充它的功能,我们可以再写一个TableA的分部类。

以后,新增一个表TableB,在DAL这里,一般情况下只需新增一句:

[csharp] view plain copy

  1. public partial class TableB : BaseCommon<Model.TableB> { }

是不是很方便?

3、BLL

BLL是供UI层,或者上一层调用的,因此,它每个对象,也应该有增删改查的基本功能。当然,BLL无须直接实现,是通过调用DAL来实现:

[csharp] view plain copy

  1. public abstract class Common<TDAL, TModel> : Interface.ICommon<TModel>
  2. where TDAL : class ,new()
  3. where TModel : class ,Interface.IEntity
  4. {
  5. protected TDAL dal;
  6. private Interface.ICommon<TModel> common;
  7. public Common()
  8. {
  9. dal = new TDAL();
  10. common = (Interface.ICommon<TModel>)dal;
  11. }
  12. #region ICommon<TModel>
  13. public TModel Add(TModel model)
  14. {
  15. return common.Add(model);
  16. }
  17. public TModel Update(TModel model)
  18. {
  19. return common.Update(model);
  20. }
  21. public void Delete(TModel model)
  22. {
  23. common.Delete(model);
  24. }
  25. public void Delete(params object[] keyValues)
  26. {
  27. common.Delete(keyValues);
  28. }
  29. public TModel Find(params object[] keyValues)
  30. {
  31. return common.Find(keyValues);
  32. }
  33. public List<TModel> FindAll()
  34. {
  35. return common.FindAll();
  36. }
  37. #endregion
  38. }

与DAL类似,TableA对象在这里是这样的:

[csharp] view plain copy

  1. public partial class TableA : Common<DAL.TableA, Model.TableA> { }

同理,如果以后新增了表TalbeB,在这里也只是新增一句而已。

这里还有一个好处,就是对外界调用而言,根本不需要知道泛型,就是一个 TableA table = new TalbeA();就可以了。

时间: 2024-09-30 20:08:39

EF框架的相关文章

【.NET】EF框架之环境配置

我们的开发环境是VS2012,既然要使用EF做框架,必然要安装EntityFramework.这是EF框架的编程模型,微软官网可以下载,现在的版本是EF6.1.1.行动之前先安装一个插件,叫做NuGet PackageManager,它的作用就是为VS工程项目自动下载/安装/升级/配置/移除包. 方法如下: 插件安装完成后重启VS.然后新建一个C#项目. 然后再控制台输入下图红色框中的命令: 安装完成后,你会惊奇的发现: (1)多了一个文件. (2)App.Config内容多了一部分. <con

EF框架操作postgresql,实现WKT类型坐标的插入,查询,以及判断是否相交

1.组件配置 首先,要下载.NET for Postgresql的驱动,npgsql,EF6,以及EntityFramework6.Npgsql,版本号 3.1.1.0. 由于是mvc项目,所以,把相应的配置文件写在web.config里面,如下: 1 <configSections> 2 <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?L

ASP.NET MVC+EF框架+EasyUI实现权限管理系列

http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也要感谢大家了,因这个 项目我已经上传了,得到了很多网友的评价,也有好多人发邮件给我说这个框架容易出现问题,不能访问,这也是支持我写这个系列的动力,我将这个项目写成一个 系列

【.NET】EF框架之三种模式

使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. 今天老师宏观给讲了一下EF的好处,抛出为什么要用EF的问题,我们的回答仅仅是概念和技术上的浅显的认识,老师的话我并未全部理解.先来整理一下自己所认识的EF吧. Entity Framework是ORMapping的一种具体实现,那ORMapping又是什么呢?ORM--ObjectRelation Mapping,即对象关系映

C# CodeFirst(EF框架)代码优先创建数据库

namespace WebEF.Model{ public class ModelContext:DbContext //继承DBcontext 来自EF框架 { public ModelContext() : base("name=配置文件名") { //读取配置文件 /*配置文件的设置格式 <connectionStrings> <add name="配置文件名" connectionString="Data Source=(. .l

VS2012里面使用EF框架的增删改查和分页的方法

public class BaseRepository<T> where T : class    {        //实例化EF框架        DataModelContainer db = new DataModelContainer(); //添加        public T AddEntities(T entity)        {            db.Entry<T>(entity).State = EntityState.Added;        

.net EF框架 MySql实现实例

1.nuget中添加包EF和MySql.Data.Entity 2.config文件添加如下配置 1.配置entitframework节点(一般安装EF时自动添加) <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <

ASP.NET MVC+EF框架+EasyUI实现权限管理

4.为什么使用MVC而不是用WebForm呢? (1)为什么使用MVC而不是用WebForm呢?这个是我临时想的,因为我就是想说明一下WebForm和MVC的优缺点,来可以使大家能够更好地理解 MVC和WebForm,而不像某些人说MVC会替代WebForm,我个人认为这个可能性很小,因为各有各的好处,看在哪里使用吧,下面我就简单介绍下 WebForm和MVC的优缺点. (2)WebForm介绍 1)优点 1):支持事件模型,取决于微软提供了丰富的服务器端组建,WebForm可以快速的搭建Web

自己实现的一个简单的EF框架(反射实现)

我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一个sql语句工厂,用于生成sql语句.调用类型工厂 写了一个类型工厂,用于获取所需的类型,识别特性等. appsettings.json是配置文件 最后一个是使用说明 我实现过程的首先从底层开始. 首先写的是类型工厂 结构 BaseTypeHelper.cs 是基础的类型帮助类 TypeHelper

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(5)-前台JqueryEasyUI前台实现

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(5)-前台JqueryEasyUI前台实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装 前言:今天经理买了一个诺基亚的Windows Phone 8系统,特感兴趣,所以在哪里看了很长时间,这篇文章就写的有点迟, 从这个Demo开始到现在我已经写了4篇博客了,终于可以看到页面的东