EntityFramework 簡單入個門

来源:http://www.cnblogs.com/zhhh/archive/2017/01/19/6298689.html
-Advertisement-
Play Games

任何一個和數據相關的系統里,數據持久化都是一個不容忽視的問題。 一直以來,Java 平臺出了很多 NB 的 ORM 框架,Hibernate、MyBatis等等。.NET 平臺上,ORM 框架這一塊一直沒有一個能吊到讓幾乎所有開發人員改掉以拼寫 SQL 語句訪問資料庫的習慣。 實際上,在 .NET ...


  任何一個和數據相關的系統里,數據持久化都是一個不容忽視的問題。

  一直以來,Java 平臺出了很多 NB 的 ORM 框架,Hibernate、MyBatis等等。.NET 平臺上,ORM 框架這一塊一直沒有一個能吊到讓幾乎所有開發人員改掉以拼寫 SQL 語句訪問資料庫的習慣。

  實際上,在 .NET 平臺上,也層出不窮的出現了很多類似的玩意兒,比如Nhibernate、Ibatis,還有微軟的親兒子——坑爹的 LinqToSQL。雖然這麼多框架,但是真的沒見過 .NET 平臺的 ORM 框架能像 Java 里那樣普及。

  所幸,微軟又搞出來一個兒子——EntityFramework。前幾個版本沒用過,前幾天直接瞭解了6.1.3版本的。。感覺,真 TMD 好用。。

  鑒於網上的所有教程都太教條式,入門時看起來很坑爹,所以將這篇心得做為隨筆,供大家共同學習探討。

 

一、安裝框架

  首先,要添加環境。右鍵項目,可以在 NuGet 里直接安裝。如下圖:

  

  安裝完成以後,項目引用里新增了兩個關於EntityFramework的引用,如下圖:

   到此,環境就配置好了。

 

 二、創建Context類和模型類

  0,準備資料庫。

  寫代碼之前,我們得先有一個測試資料庫,和一個測試表。

  這裡我使用 SQLServer,表結構如下:

 

  EF的使用有三種模式:Model First、DataBase First 和 Code First。這幾種First什麼區別,沒仔細研究。不過我這裡使用的好像是 Code First 構建的項目。這種方式,我只是覺得方便,好用,感覺項目更乾凈,不用添加亂七八糟的代碼和配置。

  1,添加模型類。

  EF 里的模型類和普通的類一樣,無非是為類或屬性添加一些屬性標記對錶的關係進行一些映射罷了。如下: 

    [Table("Users")]
    public class UserInfo
    {
        [Key]
        [StringLength(20)]
        [Column("Code")]
        public string Code { get; set; }

        [StringLength(20)]
        public string Name { get; set; }
    }

 

   上面代碼中,定義了以下幾個關鍵信息:

    1,類 UserInfo 對應資料庫里的 Users 表。

    2,Code 屬性對應資料庫里的 Code 欄位(如果屬性名和欄位名相同,可以忽略這個配置,比如 Name 屬性)。

    3,並且指明兩個字元型屬性的長度不能超過20個字元。

    4,指示 Code 屬性所對應的列是主鍵列。

  (註:Table、Key、StringLength、Column 這幾個類需要引用命名空間 System.ComponentModel.DataAnnotations 和 using System.ComponentModel.DataAnnotations.Schema )

 

   2,添加 DbContext 類。

   DbContext 類是 EF 的核心,封裝了所有數據存取業務相關的邏輯。不管是增刪改查還是事務什麼什麼,所有的資料庫操作的業務都可以在這裡搞定。。聽起來很牛逼!

  聽起來很牛逼,事實上更牛逼!

  雖然很牛逼,但是用起來超級簡單。比如像下麵的代碼,就實現了一個簡單的 DbContext 類:

    public class DALContext : DbContext
    {
        public DALContext() : base("name=DALContext")
        {
        }

        public virtual DbSet<UserInfo> Users { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

        }
    }

  寥寥幾行,完成了複雜的 DB 操作。

  上面代碼簡單說明一下:

    1,這個類名自己起,想叫啥叫啥,我這裡叫 DALContext。

    2,這個類必需繼承 DbContext 類。

    3,在構造方法里,調用父類的構造方法,指明如何連接資料庫,這裡可以是連接字元串,也可以是配置文件里配置的連接名稱(連接名稱必需首碼 name= )。

    4,virtual 聲明的 DbSet<T> 類型的屬性里封裝了一大堆數據操作的業務邏輯,我們只需要操作該屬性就行了。

    5,有幾個表,就聲明幾個 DbSet<T> 類型的屬性就行了。T 是前面代碼中聲明的 Model ,屬性名自己隨便起。

    6,OnModelCreating 方法有什麼用?具體的我也不知道。

  (這個類要引用命名空間 System.Data.Entity)

  3,配置連接字元串

  打開配置文件,添加一個名為 DALContext 的連接字元串配置。如下圖:  

  (打開配置文件我們會發現,裡面多了一些關於 entityFramework 的奇怪的東西。至於是不是必要的,刪了會不會死人,我也不知道)

  至此,資料庫表的映射就Ok了。

 
三、編寫測試代碼

  廢話不說,上代碼:

        static void Main(string[] args)
        {
            using (DALContext db = new DALContext())
            {
                try
                {
                    db.Users.Add(new UserInfo() {
                        Code = DateTime.Now.Ticks.ToString(),
                        Name = "張三"
                    });

                    IEnumerable<UserInfo> users = db.Users.Where<UserInfo>(u => u.Name == "張三");

                    foreach(var u in users)
                    {
                        Console.WriteLine(string.Format("{0} - {1}",u.Code,u.Name));
                    }

                    db.SaveChanges();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }

 

  在 Main 方法里,我們聲明瞭一個 DALContext 對象 db,為了便於對象資源的釋放,這裡使用 using  將其包起來。

  這段代碼實現了以下功能:

    1,訪問 db 對象 的 Users 屬性,使用 Add 方法像操作一個集合一樣向資料庫表裡增加一條記錄。

    2,訪問 db 對象 的 Users 屬性,使用 Where 方法根據條件查詢一批數據對象,保存在變數 users 里,並迴圈輸出到控制台。

    3,使用 db 對象的 SaveChanges 方法,將對資料庫的變更提交。

  運行以後,結果如下:

  上面例子實現了增加和查詢功能,刪除和修改功能類似於操作集合,只要保證最後調用 SaveChanges 方法將修改提交就行。

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.重寫GetHashCode方法註意點: (1)重寫GetHashCode方法,也應重寫Equals方法,否者編譯器會警告。 (2)相等的對象必須有相等的散列碼(若a.Equals(b),則a.GetHashCode()==b.GetHashCode())。 (3)GetHashCode()不應引 ...
  • 1.結構:結構除了可以含有屬性和欄位,還可以包方法和構造器,但不能包含黠認(無參數}的構造器。有的時候(比如在實例化一個數組的時候)不會調用值類型的構造器,因為所有數組記憶體都轉為用零來初始化,為了避免因為預設構造器只是偶爾調用而造成不一致,C#完全禁止了用戶顯式定義預設構造器,因為編譯器會將聲明時的 ...
  • 接 上一篇 內容, 這裡先看一下錯誤處理過濾器. 在看此部分之前, 先看看MVC已經提供的功能吧. 一. MVC 自帶功能 1. 配置方法 這裡的mode預設是 Off , 就是會在頁面中直接顯示詳細的錯誤信息. 如果是 On, 則不會顯示詳細的錯誤信息, 顯示是這樣的: 在沒有配置具體 statu ...
  • 最近遇到的一個項目中用到了標題所說的方法,用Spring.Net將業務類封閉成WebService供其它地方調用使用,感覺還是蠻新鮮的,於是在園子中搜了一篇園友寫的文章(這裡)自己也嘗試著搭了一個環境,最後是順利跑了起來,但是中間遇到了幾個問題,這裡記錄一下。 具體的搭建方法不再贅述,上面的文章寫的 ...
  • ...
  • 前言 EF通過linq和各種擴展方法,再加上實體模型,編寫資料庫的訪問代碼確實是優美、舒服,但是生成的sql不盡如意、性能低下,尤其是複雜些的邏輯關係,最終大家還是會回歸自然,選擇能夠友好執行sql語句的ORM,認認真真的編寫sql;問題是:EF是否也能夠很友好的執行sql語句?EF提供直接執行sq ...
  • 背水一戰 Windows 10 之 控制項(導航類): Frame ...
  • 在ASP.NET MVC中,Ajax.BeginForm扮演著非同步提交的重要角色。其中就有五個重載方法,但是在實際應用中,你未必使用的得心應手,今天我們就從主要的參數來一探究竟。 一、actionName 用於指定請求地址的Action名稱。 二、controllerName 用於指定請求地址的Co ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...