通過 Code First 開發建立新資料庫

来源:http://www.cnblogs.com/-free/archive/2016/11/17/6073496.html
-Advertisement-
Play Games

本演練介紹瞭如何使用新資料庫進行 Code First 開發。我們用類定義一個模型,然後使用該模型創建一個資料庫,然後存儲和檢索數據。資料庫創建之後,我們使用 Code First 遷移將架構更改為我們發展後的模型。此外還介紹瞭如何使用數據註釋和 Fluent API 來配置模型。 ...


必備條件

要完成本演練,需要安裝 Visual Studio 2010 或 Visual Studio 2012。

如果使用的是 Visual Studio 2010,還需要安裝 NuGet

 

1.創建應用程式

簡單起見,我們將構建一個使用 Code First 執行數據訪問的基本控制台應用程式。

  • 打開 Visual Studio
  • “文件”->“新建”->“項目…”
  • 從左側菜單中選擇“Windows”和“控制台應用程式”
  • 輸入 CodeFirstNewDatabaseSample 作為名稱
  • 選擇“確定”

 

2.創建模型

我們使用類來定義一個非常簡單的模型。在 Program.cs 文件中進行定義,但是實際應用程式中,可能會將類分為若幹個單獨的文件,可能作為單獨的項目。

在 Program.cs 中的程式類定義下,添加以下兩個類。

public class Blog 

    public int BlogId { get; set; } 
    public string Name { get; set; } 
 
    public virtual List<Post> Posts { get; set; } 

 
public class Post 

    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 
 
    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
}

可以看到,我們將虛擬化兩個導航屬性(Blog.Posts 和 Post.Blog)。這將啟用實體框架的延遲載入功能。延遲載入意味著,嘗試訪問這些屬性的內容時,將自動從資料庫載入。

 

3.創建上下文

現在,可以定義派生上下文,用於表示資料庫的一個會話,以便我們查詢和保存數據。我們定義一個派生自 System.Data.Entity.DbContext 的上下文,併為模型中的每個類公開一個類型化 DbSet<TEntity>。

現在,開始使用來自實體框架的類型。因此,我們需要添加 EntityFramework NuGet 程式包。

  • “項目”–>“管理 NuGet 程式包…”
    註意:如果沒有“管理 NuGet 程式包…”選項,則應安裝 最新版本的 NuGet
  • 選擇“聯機”選項卡
  • 選擇“EntityFramework”程式包
  • 單擊“安裝”

在 Program.cs 頂部,為 System.Data.Entity 添加一個 using 語句。

using System.Data.Entity;

在 Program.cs 中的 Post 類下,添加以下派生上下文。

public class BloggingContext : DbContext 

    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
}

下麵是 Program.cs 現在應包含內容的完整列表。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data.Entity; 
 
namespace CodeFirstNewDatabaseSample 

    class Program 
    { 
        static void Main(string[] args) 
        { 
        } 
    } 
 
    public class Blog 
    { 
        public int BlogId { get; set; } 
        public string Name { get; set; } 
 
        public virtual List<Post> Posts { get; set; } 
    } 
 
    public class Post 
    { 
        public int PostId { get; set; } 
        public string Title { get; set; } 
        public string Content { get; set; } 
 
        public int BlogId { get; set; } 
        public virtual Blog Blog { get; set; } 
    } 
 
    public class BloggingContext : DbContext 
    { 
        public DbSet<Blog> Blogs { get; set; } 
        public DbSet<Post> Posts { get; set; } 
    } 
}

這是我們開始存儲和檢索數據所需的全部代碼。顯然,後臺發生了許多事情。稍後,我們將進行瞭解。但是,首先讓我們看看它是如何運行的。

 

4.讀寫數據

實現 program.cs 中的 Main 方法,如下所示。這些代碼為上下文創建一個新實例,然後使用該實例插入新博客。之後,它使用 LINQ 查詢檢索資料庫中的所有博客(按標題的字母順序進行排序)。

class Program 

    static void Main(string[] args) 
    { 
        using (var db = new BloggingContext()) 
        { 
            // Create and save a new Blog 
            Console.Write("Enter a name for a new Blog: "); 
            var name = Console.ReadLine(); 
 
            var blog = new Blog { Name = name }; 
            db.Blogs.Add(blog); 
            db.SaveChanges(); 
 
            // Display all Blogs from the database 
            var query = from b in db.Blogs 
                        orderby b.Name 
                        select b; 
 
            Console.WriteLine("All blogs in the database:"); 
            foreach (var item in query) 
            { 
                Console.WriteLine(item.Name); 
            } 
 
            Console.WriteLine("Press any key to exit..."); 
            Console.ReadKey(); 
        } 
    } 
}

現在,可以運行應用程式,對其進行測試。

Enter a name for a new Blog: ADO.NET 博客
All blogs in the database:
ADO.NET 博客
Press any key to exit...

 

我的數據在哪裡?

按照約定,DbContext 已經創建了一個資料庫。

  • 如果本地 SQL Express 實例可用(預設情況下隨 Visual Studio 2010 安裝),則 Code First 已對該實例創建了資料庫
  • 如果 SQL Express 不可用,則 Code First 將嘗試使用 LocalDb(預設情況下隨 Visual Studio 2012 安裝)
  • 資料庫以派生上下文的完全限定名命名,在我們的示例中,名稱為 CodeFirstNewDatabaseSample.BloggingContext

這些僅僅是預設約定,除此之外,還有多種方式可更改 Code First 所用的資料庫。有關更多信息,請參見DbContext 如何發現模型和資料庫連接 主題。

 

可以在 Visual Studio 中使用伺服器資源管理器連接至此資料庫

  • “視圖”->“伺服器資源管理器”
  • 右鍵單擊“數據連接”並選擇“添加連接…”
  • 如果尚未從伺服器資源管理器連接至資料庫,則需要選擇 Microsoft SQL Server 作為數據源
    Microsoft SQL Server 已選為數據源
  • 連接至 LocalDb ((localdb)\v11.0) 或 SQL Express (.\SQLEXPRESS),具體取決於安裝情況
    連接至 (localdb)\v11.0 上的博客資料庫連接至 .\SQLEXPRESS 上的博客資料庫

 

現在,可以檢查 Code First 已經創建的架構。

顯示在伺服器資源管理器中的架構

DbContext 通過查看我們定義的 DbSet 屬性,瞭解模型包含哪些類。隨後,它使用 Code First 約定的預設集來確定表和列的名稱,確定數據類型,查找主鍵等。本演練稍後將介紹如何重寫這些約定。

 

5.處理模型更改

現在更改模型,當我們進行更改時,還需要更新資料庫架構。為此,我們使用一個稱為“Code First 遷移”(或簡稱“遷移”)的功能。

“遷移”是一組有序的步驟,描述如何升級(和降級)資料庫架構。這些步驟(稱為“遷移”)中的每個步驟均包含一些代碼,用於描述要應用的更改。 

第一步是為 BloggingContext 啟用 Code First 遷移。

  • “工具”->“庫程式包管理器”->“程式包管理器控制台”
  • 在程式包管理器控制臺中運行 Enable-Migrations 命令
  • 一個新的 Migrations 文件夾已添加至項目中,它包含兩個文件:
    • Configuration.cs — 此文件包含“遷移”將用來遷移 BloggingContext 的設置。在本演練中不需要進行任何更改,但是,在此處可以指定種子數據、為其他資料庫註冊提供程式、更改生成遷移的命名空間等。
    • <時間戳>_InitialCreate.cs — 這是第一個遷移,它表示已經應用於資料庫的更改。應用更改的目的是將其從空資料庫遷移至包含博客和文章表的資料庫。儘管我們讓 Code First 自動創建這些表,現在我們選擇“遷移”(已轉化為一次“遷移”)。Code First 還在本地資料庫中記錄:該“遷移”已經應用。文件名中的時間戳用於排序。

    現在,更改模型,向 Blog 類添加一個 Url 屬性:
public class Blog 

    public int BlogId { get; set; } 
    public string Name { get; set; } 
    public string Url { get; set; } 
 
    public virtual List<Post> Posts { get; set; } 
}
  • 在程式包管理器控制臺中運行 Add-Migration AddUrl 命令。

    Add-Migration 命令檢查自上次遷移後是否有更改,並使用所有更改搭建新遷移。我們可以為遷移指定名稱;在本例中,將此遷移稱為“AddUrl”。

    搭建的代碼表明:我們需要向 dbo.Blogs 表添加可容納字元串數據的 Url 列。如果需要,可以對搭建的代碼進行編輯,但是,在本例中,沒有這個必要。

namespace CodeFirstNewDatabaseSample.Migrations 

    using System; 
    using System.Data.Entity.Migrations; 
     
    public partial class AddUrl : DbMigration 
    { 
        public override void Up() 
        { 
            AddColumn("dbo.Blogs", "Url", c => c.String()); 
        } 
         
        public override void Down() 
        { 
            DropColumn("dbo.Blogs", "Url"); 
        } 
    } 
}
  • 在程式包管理器控制臺中運行 Update-Database 命令。此命令將所有掛起的遷移應用於資料庫。InitialCreate 遷移已經應用,因此,這些遷移將僅應用新的 AddUrl 遷移。

    提示:在調用 Update-Database 命令查看對資料庫執行的 SQL 時,可以使用 –Verbose 開關。

 

新的 Url 列已添加至資料庫中的 Blogs 表:

顯示在伺服器資源管理器中的架構 

6.數據註釋

到目前為止,EF 發現了使用其預設約定的模型。但是,有時類不遵從約定,我們需要能夠執行進一步配置。對此有兩種方法;本節將介紹數據註釋,下一節將介紹 Fluent API。

  • 向模型添加用戶類
public class User 

    public string Username { get; set; } 
    public string DisplayName { get; set; } 
}
  • 我們還需要向派生上下文添加一個集
public class BloggingContext : DbContext 

    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
    public DbSet<User> Users { get; set; } 
}
  • 如果嘗試添加遷移,會收到錯誤消息“EntityType‘User’未定義鍵。請為該 EntityType 定義鍵。”這是因為 EF 無法知道 Username 應為用戶的主鍵。
  • 我們將使用數據註釋,因此需要在 Program.cs 的頂部添加一個 using 語句
using System.ComponentModel.DataAnnotations;
  • 現在,註釋 Username 屬性,將它標識為主鍵
public class User 

    [Key] 
    public string Username { get; set; } 
    public string DisplayName { get; set; } 
}
  • 使用 Add-Migration AddUser 命令搭建一個遷移,將這些更改應用於資料庫
  • 運行 Update-Database 命令,將新遷移應用於資料庫

現在,新表已添加至資料庫:

顯示在伺服器資源管理器中的架構

 

EF 支持的完整註釋列表為:

 

7.Fluent API

上一節介紹瞭如何使用數據註釋來補充或重寫按約定檢測的內容。另一種模型配置方法是通過 Code First Fluent API。

大多數模型配置都可使用簡單數據註釋進行。Fluent API 是一種更高級的方法,除某些數據註釋不可能支持的更高級配置外,可以指定包含數據註釋所有功能的模型配置。數據註釋和 Fluent API 可一起使用。

要訪問 Fluent API,需要在 DbContext 中重寫 OnModelCreating 方法。假設我們需要重命名 User.DisplayName 存儲至 display_name 的列。

  • 使用以下代碼重寫 BloggingContext 的 OnModelCreating 方法
public class BloggingContext : DbContext 

    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
    public DbSet<User> Users { get; set; } 
 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Entity<User>() 
            .Property(u => u.DisplayName) 
            .HasColumnName("display_name"); 
    } 
}
  • 使用 Add-Migration ChangeDisplayName 命令搭建遷移,將這些更改應用於資料庫。
  • 運行 Update-Database 命令,將新遷移應用於資料庫。

 

DisplayName 列現在重命名為 display_name:

顯示在伺服器資源管理器中的架構

摘要

本演練介紹瞭如何使用新資料庫進行 Code First 開發。我們用類定義一個模型,然後使用該模型創建一個資料庫,然後存儲和檢索數據。資料庫創建之後,我們使用 Code First 遷移將架構更改為我們發展後的模型。此外還介紹瞭如何使用數據註釋和 Fluent API 來配置模型。


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

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 如何做到將客戶伺服器資料庫的備份,下載到本地的雲服務上? 在開發這個程式中中途也遇到了一下問題,下麵我將自己如何進解決的辦法寫出來供大家參考。 一.首先我需要進行描述一下問題: 1.比如有兩台伺服器A,B(雲伺服器) 將A中的伺服器中的資料庫的備份進行下載到B的雲服務中並保存。 2.當 ...
  • 感謝您的閱讀。喜歡的、有用的就請大哥大嫂們高抬貴手“推薦一下”吧!你的精神支持是博主強大的寫作動力以及轉載收藏動力。歡迎轉載! 版權聲明:本文原創發表於 【請點擊連接前往】 ,未經作者同意必須保留此段聲明!如有侵權請聯繫我刪帖處理! 我的博客:http://www.cnblogs.com/GJM6/ ...
  • 字元串轉組件名 字元串轉變數名 或 ...
  • EntityFramework 一對一關係映射有很多種,比如主鍵作為關聯,配置比較簡單,示例代碼: 上面代碼表示 Teacher 和 Student 一對一關係,Fluent API 配置如下: 測試代碼: 生成 SQL 代碼: 另一種 Fluent API 配置如下: 執行同樣測試代碼,生成 SQ ...
  • ...
  • 本文主要涉及兩個概念: 阿裡雲OSS:對象存儲(Object Storage Service,簡稱OSS),是阿裡雲對外提供的海量、安全和高可靠的雲存儲服務。 bootstrap-fileinput:An enhanced HTML 5 file input for Bootstrap 3.x wi ...
  • 刪除重覆的文件功能 使用方法: 建一個BAT文件,如1.bat,裡面寫入:RemoveDuplicate.exe path1 path2 (或者在命令行下輸入以上內容) 其中path1表示原文件夾,path2表示要檢測和刪除的文件夾 例如文件夾path1中有:1.txt、2.txt、3.txt、4. ...
  • 吃飯的時候翻開推特發現巨硬在開大會,真是後知後覺啊。整理了一下幾個大事分享出來: 1.谷歌雲加入了.NET 基金會的一個小組。 2.三星Tizen系統將整合.NET Core平臺,並於2017年正式推出。這個系統目前貌似主要用在三星電視中,原文描述如下: Tizen’s .NET support w... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...