程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Entity Famework 的通過IOC注入實現,fameworkioc

Entity Famework 的通過IOC注入實現,fameworkioc

編輯:C#入門知識

Entity Famework 的通過IOC注入實現,fameworkioc


 

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

 

以上的代碼下載地址: 點擊

      

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved