Entity Famework 的通過IOC註入實現

来源:http://www.cnblogs.com/cnwisdom/archive/2016/05/27/5534611.html
-Advertisement-
Play Games

1、 前言 最近剛換了一家公司,由於之前的公司代碼並沒有用到項目框架,需要我整理下NHibernate與Entity Framework之間的區別及適用性。並寫出相關的示例代碼 面試的時候吹的牛,得把他填上啊。 剛剛整完相應的EF code first的示例代碼,需要連接oracle,那個資料庫遷移 ...


 

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();

             	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用指定資料庫 use v4base 建一張表 / 小區主檔記錄,要保證與OrgLevelUnit同步 / IF not exists(SELECT OBJECT_NAME (id )FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY (id, ...
  • 索引的基本概念: (1).要理解索引,可以把書作為一個模型類比。一本書里的內容,相當於一張大表存儲的數據,而書前面的目錄就相當於這個表的索引; (2).索引可以擁有獨立的存儲磁碟空間; (3).索引占用的磁碟空間要比表小的多,其主要作用是為了加快對數據的搜索速度; (4).同時可以保證數據的唯一性。 ...
  • 今天在幫客戶做語句優化的時候,突然遇到這樣一個語句,類似下麵的例子(原語句是個update) 例子中使用AdventureWorks數據中的兩個表。 productID 是[Production].[Product] 表的主鍵,在[Purchasing].[PurchaseOrderDetail] ...
  • [epeter@ localhost ~]$ 其中:epeter 是用戶名;localhost 是當前主機名; ~ 破浪號代表當前是用戶目錄( 如果是 / 斜線代表當前是根目錄);$ 代表當前以普通用戶登錄(如果是 # 代表當前以根用戶登錄(root用戶或者具有管理員許可權))。 命令由三個部分組成: ...
  • 註意首先要安裝url重定向模塊 https://www.microsoft.com/zh-CN/download/details.aspx?id=7435 然後在web.config末尾添加如下代碼 <system.webServer> <rewrite> <rules> <rule name="H ...
  • 本程式為自己所寫,參考素材包括微軟官方例子和外文資料,自己做了部分的優化。解釋的如果有問題,懇請大家指正. 後臺代碼: XAML界面代碼: ...
  • 1、先解釋一下,什麼叫做動態數據,動態數據指的是,一條數據的格式固定,但數據的條數不固定。 2、應用環境,在一個表格當中如果,現在表格有三行n列,如果你需要在表格第一行後添加同等規格的一行或n行,應該怎麼去做? 3、根據上面的應用環境,不難發現,要完成這項工作的5個過程,1、找到位置。2、獲取模板行 ...
  • 導出時:引用 using Excel = Microsoft.Office.Interop.Excel; #region 讀取excel //打開方法 public DataTable ExceltoDataSet(string path) { string strConn = "Provider= ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...