• 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.Xml.Linq;
    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.Xml.Linq;
    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.Xml.Linq;
    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(但是这个ORM相对于查询效率上来说,还是会比较慢。所以运行效率更高的框架)

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

          

      

  • 相关阅读:
    DAY 223 GIT
    swooleHTTP
    swooleWebSocket
    swooleUDP
    swoole异步MySql
    swooleTCP
    谈谈继承的局限性
    也谈过程决定质量
    谁该为参数负责
    使用function改进设计
  • 原文地址:https://www.cnblogs.com/cnwisdom/p/5534611.html
Copyright © 2020-2023  润新知