你的位置:首页 > ASP.net教程

[ASP.net教程]Entity Famework 的通过IOC注入实现


 

1、 前言

  最近刚换了一家公司,由于之前的公司代码并没有用到项目框架,需要我整理下NHibernate与Entity Framework之间的区别及适用性。并写出相关的示例代码

面试的时候吹的牛,得把他填上啊。

    刚刚整完相应的EF code first的示例代码,需要连接oracle,那个数据库迁移整的我不要不要的,最后还没搞出来。对于EF 调用oralce的存储过程,也没有搞出来。

有这方面资料的园友,请告知啊。

2、思路

     先把基于DBcontext的类,进行继承,创建出基于Tclass的base类,创建出基于T的操作方法。好吧,我也讲不明白了,大神求教。然后所有的方法调用,通过IOC进行注入

3、准备条件

  VS2013、oracle11g

4、代码

  OracleDBContext类继承与DBContext

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.using System.Data.Common;using System.Data.Entity;using System.Data.Entity.Core.Objects;using System.Data.Entity.Migrations;using System.Data.Entity.Infrastructure;using System.Data.Entity.Migrations.History;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;namespace DALClass{  public class OracleDBContext : DbContext  {    //public DbSet<CAT> cat { get; set; }    //public DbSet<FOOD> food { get; set; }    public OracleDBContext()      : base("OracleDbContext")    {      Database.SetInitializer<OracleDBContext>(null);    }    public OracleDBContext(string connString)      : base(connString)    {      Database.SetInitializer<OracleDBContext>(null);    }    public override string ToString()    {      return base.ToString();    }    protected override void OnModelCreating(DbModelBuilder modelBuilder)    {      modelBuilder.HasDefaultSchema("CNBLOGS");    }  }}

OracleDBContext

     OracleDbSetBase<T>继承与OracleDBContext

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.using System.Data.Common;using System.Data.Entity;using System.Data.Entity.Core.Objects;using System.Data.Entity.Migrations;using System.Data.Entity.Infrastructure;using System.Data.Entity.Migrations.History;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;namespace DALClass{  public class OracleDbSetBase<T> : OracleDBContext where T : class  {    public OracleDbSetBase(string connString) : // 数据库链接字符串      base(connString)    {      Database.SetInitializer<OracleDbSetBase<T>>(null);//设置为空,防止自动检查和生成    }    public DbSet<T> Entities { get; set; }  }}

OracleDbSetBase

      IOracleDbDAL 数据库操作方法接口(暂时只定义一个方法,方便大家看)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Linq.Expressions;namespace CommonClass{  public interface IOracleDbDAL  {        bool Add<T>(T entity,string connstring) where T:class;    //bool Update<T>(T entity) where T : class;    //bool Delete<T>(T entity) where T : class;  }}

IOracleDbDAL

     OracleDbDAL 类 基于IOracleDbDAL 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.using System.Data.Common;using System.Data.Entity;using System.Data.Entity.Core.Objects;using System.Data.Entity.Migrations;using System.Data.Entity.Infrastructure;using System.Data.Entity.Migrations.History;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Linq.Expressions;using CommonClass;namespace DALClass{  public class OracleDbDAL :IOracleDbDAL  {    //public string connstring { get; set; }    ////public OracleDbDAL()    ////{    ////  this.connstring = "OracleDbContext";    ////}    //public OracleDbDAL(string connString)    //{    //  this.connstring = connString;    //}    #region    public bool Add<T>(T entity,string connstring) where T : class    {      using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))      {        db.Entry<T>(entity).State = EntityState.Added;        return db.SaveChanges() > 0;      }    }    ///// <summary>    ///// 修改    ///// </summary>    ///// <param name="entity">实体</param>    ///// <returns>返回受影响行数</returns>    //public bool Update<T>(T entity) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    db.Set<T>().Attach(entity);    //    db.Entry<T>(entity).State = EntityState.Modified;    //    return db.SaveChanges() > 0;    //  }    //}    ///// <summary>    ///// 删除    ///// </summary>    ///// <param name="entity">实体</param>    ///// <returns>返回受影响行数</returns>    //public bool Delete<T>(T entity) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    db.Set<T>().Attach(entity);    //    db.Entry<T>(entity).State = EntityState.Deleted;    //    return db.SaveChanges() > 0;    //  }    //}    ///// <summary>    ///// 根据条件删除    ///// </summary>    ///// <param name="deleWhere">删除条件</param>    ///// <returns>返回受影响行数</returns>    //public bool DeleteByConditon<T>(Expression<Func<T, bool>> deleWhere) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    List<T> entitys = db.Set<T>().Where(deleWhere).ToList();    //    entitys.ForEach(m => db.Entry<T>(m).State = EntityState.Deleted);    //    return db.SaveChanges() > 0;    //  }    //}    ///// <summary>    ///// 查找单个    ///// </summary>    ///// <param name="id">主键</param>    ///// <returns></returns>    //public T GetSingleById<T>(int id) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    return db.Set<T>().Find(id);    //  }    //}    ///// <summary>    ///// 查找单个    ///// </summary>    ///// <param name="seleWhere">查询条件</param>    ///// <returns></returns>    //public T GetSingle<T>(Expression<Func<T, bool>> seleWhere) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    return db.Set<T>().FirstOrDefault(seleWhere);    //  }    //}    ///// <summary>    ///// 获取所有实体集合    ///// </summary>    ///// <returns></returns>    //public List<T> GetAll<T>() where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    return db.Set<T>().ToList<T>();    //  }    //}    ///// <summary>    ///// 获取所有实体集合(单个排序)    ///// </summary>    ///// <returns></returns>    //public List<T> GetAll<T, Tkey>(Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    return CommonSort(db.Set<T>(), orderWhere, isDesc).ToList<T>();    //  }    //}    ///// <summary>    ///// 单个排序通用方法    ///// </summary>    ///// <typeparam name="Tkey">排序字段</typeparam>    ///// <param name="data">要排序的数据</param>    ///// <param name="orderWhere">排序条件</param>    ///// <param name="isDesc">是否倒序</param>    ///// <returns>排序后的集合</returns>    //public IQueryable<T> CommonSort<T, Tkey>(IQueryable<T> data, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class    //{    //  if (isDesc)    //  {    //    return data.OrderByDescending(orderWhere);    //  }    //  else    //  {    //    return data.OrderBy(orderWhere);    //  }    //}    ///// <summary>    ///// 根据条件查询实体集合    ///// </summary>    ///// <param name="seleWhere">查询条件 lambel表达式</param>    ///// <returns></returns>    //public List<T> GetList<T>(Expression<Func<T, bool>> seleWhere) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    return db.Set<T>().Where(seleWhere).ToList();    //  }    //}    ///// <summary>    ///// 根据条件查询实体集合(单个字段排序)    ///// </summary>    ///// <param name="seleWhere">查询条件 lambel表达式</param>    ///// <returns></returns>    //public List<T> GetList<T, Tkey>(Expression<Func<T, bool>> seleWhere, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    return CommonSort(db.Set<T>().Where(seleWhere), orderWhere, isDesc).ToList();    //  }    //}    ///// <summary>    ///// 获取分页集合(无条件无排序)    ///// </summary>    ///// <returns></returns>    //public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, out int totalcount) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    totalcount = db.Set<T>().Count();//获取总数    //    //需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法    //    return db.Set<T>().Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();    //  }    //}    ///// <summary>    ///// 获取分页集合(无条件单个排序)    ///// </summary>    ///// <returns></returns>    //public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    totalcount = db.Set<T>().Count();//获取总数    //    //需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法    //    return CommonSort(db.Set<T>(), orderWhere, isDesc).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();    //  }    //}    ///// <summary>    ///// 获取分页集合(有条件无排序)    ///// </summary>    ///// <returns></returns>    //public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere, out int totalcount) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    totalcount = db.Set<T>().Where(seleWhere).Count();//获取总数    //    //需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法    //    return db.Set<T>().Where(seleWhere).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();    //  }    //}    ///// <summary>    ///// 获取分页集合(有条件单个排序)    ///// </summary>    ///// <returns></returns>    //public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere,    //  Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    totalcount = db.Set<T>().Where(seleWhere).Count();//获取总数    //    //需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法    //    return CommonSort(db.Set<T>().Where(seleWhere), orderWhere, isDesc).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();    //  }    //}    //#endregion    //#region 原始sql操作    ///// <summary>    ///// 执行操作    ///// </summary>    ///// <param name="sql"></param>    ///// <param name="paras"></param>    //public void ExecuteSql(string sql, params object[] paras)     //{    //  using (OracleDBContext db = new OracleDBContext(connstring))    //  {    //    db.Database.ExecuteSqlCommand(sql, paras);    //  }    //}    ///// <summary>    ///// 查询列表    ///// </summary>    ///// <typeparam name="T"></typeparam>    ///// <param name="sql"></param>    ///// <param name="paras"></param>    ///// <returns></returns>    //public List<T> QueryList<T>(string sql, params object[] paras) where T : class    //{    //  using (OracleDBContext db = new OracleDBContext(connstring))    //  {    //    return db.Database.SqlQuery<T>(sql, paras).ToList();    //  }    //}    ///// <summary>    ///// 查询单个    ///// </summary>    ///// <typeparam name="T"></typeparam>    ///// <param name="sql"></param>    ///// <param name="paras"></param>    ///// <returns></returns>    //public T QuerySingle<T>(string sql, params object[] paras) where T : class    //{    //  using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))    //  {    //    return db.Database.SqlQuery<T>(sql, paras).FirstOrDefault();    //  }    //}    ///// <summary>    ///// 执行事务    ///// </summary>    ///// <param name="lsSql"></param>    ///// <param name="lsParas"></param>    //public void ExecuteTransaction(List<String> lsSql, List<Object[]> lsParas)    //{    //  using (OracleDBContext db = new OracleDBContext(connstring))    //  {    //    using (var tran = db.Database.BeginTransaction())    //    {    //      try    //      {    //        for (int i = 0; i < lsSql.Count; i++)    //        {    //          if (lsParas != null && lsParas.Count > 0)    //          {    //            db.Database.ExecuteSqlCommand(lsSql[i], lsParas[i]);    //          }    //        }    //        foreach (String item in lsSql)    //        {    //          db.Database.ExecuteSqlCommand(item);    //        }    //        tran.Commit();    //      }    //      catch (Exception ex)    //      {    //        tran.Rollback();    //        throw ex;    //      }    //    }    //  }    //}    //#endregion    //#region 通用属性    ///// <summary>    ///// 获取数据库服务器当前时间。    ///// </summary>    //public DateTime ServerTime    //{    //  get    //  {    //    using (OracleDBContext db = new OracleDBContext(connstring))    //    {    //      String sql = "SELECT GETDATE()";    //      Object objServerTime = db.Database.SqlQuery<Object>(sql);    //      return Convert.ToDateTime(objServerTime);    //    }    //  }    //}    ///// <summary>    ///// 获取数据库版本。    ///// </summary>    //public String DatabaseVersion    //{    //  get    //  {    //    using (OracleDBContext db = new OracleDBContext(connstring))    //    {    //      try    //      {    //        String sql = "SELECT Version FROM Sys_Version";    //        Object objServerTime = db.Database.SqlQuery<Object>(sql);    //        return Convert.ToString(objServerTime);    //      }    //      catch    //      {    //      }    //      return String.Empty;    //    }    //  }    //}    #endregion  }}

OracleDbDAL

     Ioc类(该用的是Unity)

using Microsoft.Practices.Unity;namespace CommonClass{  public class Ioc  {    private static readonly UnityContainer _container;    static Ioc()    {      _container = new UnityContainer();    }    public static void Register<TInterface, TImplementation>() where TImplementation : TInterface    {      _container.RegisterType<TInterface, TImplementation>();    }    public static void Register<TInterface, TImplementation>(TImplementation t) where TImplementation : TInterface    {      _container.RegisterInstance(t.GetType(), t);    }    //public static void Register<TInterface, TImplementation>(string conn) where TImplementation : TInterface    //{    //  _container.RegisterType<TInterface, TImplementation>(new TImplementation(conn));    //}    public static T Get<T>()    {      return _container.Resolve<T>();    }  }}

Ioc

    接下来是进行实现了,通过注入IOC来进行数据添加

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using CommonClass;using ModelClass;using DALClass;namespace FacadeClass{  public class Class1  {    public bool AAA(FOOD INFO,string connstring)    {      Ioc.Register<IOracleDbDAL, OracleDbDAL>();       var service = Ioc.Get<IOracleDbDAL>();       return service.Add(INFO, connstring);    }      }}

Facade

    最后是页面的的调用展示

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using ModelClass;using DALClass;using FacadeClass;namespace ConsoleApplication1{  class Program  {    static void Main(string[] args)    {      string connstring = "OracleDbContext";      FOOD entity = new FOOD();      entity.ID = Guid.NewGuid().ToString();      entity.CODE = "M0005";      entity.FOOTTYPE = "猫粮la5";      entity.SUPPLIER = "非洲的5";      entity.NAME = "喵吃粮食5";      FacadeClass.Class1 c = new FacadeClass.Class1();       if(c.AAA(entity, connstring))       {         Console.WriteLine("11111");       }else       {         Console.WriteLine("22222");       }      Console.ReadLine();    }  }}

ConsoleApplication1

    

5、测试结果: 就是成功啦,感觉也没啥好说的,只是现在有这么一个思路,估计各位大神早就已经用到这些了,希望各位大神不吝赐教,我最近还在愁架构的组成呢。

6、架构的满足条件

  1、能配置不同的数据库  例如 oracle、sqlserver、db2。只要通过配置或者不麻烦的修改就可以变更

      2、数据库与代码分离(这不就是现在orm的思想嘛,可是我们还在用存储过程呢)

      3、支持存储过程

      4、需要支持缓存

      5、支持百万级数据、千量的并发

      6、基于框架的二次开发简便

      7、语言是c# (不然我看不懂啊)

  有满足以上条件的框架请大神推荐啊~~ 现暂定是用spring.net+Nhibernate+MVC

 

以上的代码下载地址: 点击