EF對於已有資料庫的Code First支持

来源:http://www.cnblogs.com/yp1983/archive/2017/08/15/7368106.html
-Advertisement-
Play Games

EF對於已有資料庫的Code First支持 原文鏈接 本文將逐步介紹怎樣用Code First的方式基於已有資料庫進行開發。Code First支持你使用C#或者VB.Net定義類.並使用數據模型標識和Fluent API定義與配置模型。 前提 已經安裝 Visual Studio 2012 或者 ...


EF對於已有資料庫的Code First支持

原文鏈接

本文將逐步介紹怎樣用Code First的方式基於已有資料庫進行開發。Code First支持你使用C#或者VB.Net定義類.並使用數據模型標識和Fluent API定義與配置模型。

前提

已經安裝 Visual Studio 2012 或者 Visual Studio 2013

同時,你還需要安裝Entity Framework Tools for Visual Studio6.1或更高版本。請參考Get Entity Framework

1. 創建一個資料庫

因為本文是研究基於已有資料庫進行Code First,所以,我們先創建一個資料庫作為我們的操作目標。(至於創建資料庫的過程,可以去 原文鏈接 看圖操作,這部分內容我就不翻譯了)

Let’s go ahead and generate the database.

  • Open Visual Studio

  • View -> Server Explorer

  • Right click on Data Connections -> Add Connection…

  • If you haven’t connected to a database from Server Explorer before you’ll need to select Microsoft SQL Server as the data source

  • Connect to your LocalDb instance ((localdb)\v11.0), and enter Blogging as the database name

  • Select OK and you will be asked if you want to create a new database, select Yes

  • The new database will now appear in Server Explorer, right-click on it and select New Query

  • 複製以下代碼,到資料庫管理器中執行,以生成新的數據表

CREATE TABLE [dbo].[Blogs] ( 
    [BlogId] INT IDENTITY (1, 1) NOT NULL, 
    [Name] NVARCHAR (200) NULL, 
    [Url]  NVARCHAR (200) NULL, 
    CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC) 
); 
 
CREATE TABLE [dbo].[Posts] ( 
    [PostId] INT IDENTITY (1, 1) NOT NULL, 
    [Title] NVARCHAR (200) NULL, 
    [Content] NTEXT NULL, 
    [BlogId] INT NOT NULL, 
    CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC), 
    CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE 
); 
 
INSERT INTO [dbo].[Blogs] ([Name],[Url]) 
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/') 
 
INSERT INTO [dbo].[Blogs] ([Name],[Url]) 
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')

2.創建應用程式

依然基於簡單原則,我們還是創建一個控制台應用程式,並用Code First進行資料庫操作:

  • 打開 Visual Studio
  • 文件 -> 新建 -> 項目…
  • 選擇控制台應用程式
  • 輸入 CodeFirstExistingDatabaseSample 作為項目名
  • 點擊確定

3.逆向工程

我們將使用Entity framework Tools for Visual Studio來生成一些基於資料庫的初始化代碼。當然,你也可以手動創建這些代碼。

  • 項目 -> 添加新項…

  • 從左側菜單的數據(Data)分類中選擇Ado.net 實體模型(Ado.net Entity Data Model)(目前我的電腦上沒裝中文版,在菜單中具體顯示的選項是什麼 可能會不太精確,這裡我只能是把大概意思譯一下,請見諒,謝謝。)

  • 將新文件命名為 BloggingContext 並點擊確定

  • 這時會啟動實體模型創建嚮導

  • 選擇從資料庫創建模型(Code First from DataBase) 並點擊下一步

  • 創建連接並點擊下一步

  • 選擇要導入的數據表並點擊完成

當逆向工程完成後,項目中會自動生成一些文件,現在讓我們看看到底添加了一些什麼內容吧。

配置文件

在項目根目錄下添加了一個App.config的文件,這個文件中包含了一個有關目標資料庫的連接字元串.

<connectionStrings> 
  <add  
    name="BloggingContext"  
    connectionString="data source=(localdb)\v11.0;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"  
    providerName="System.Data.SqlClient" /> 
</connectionStrings>

你還會註意到配置文件中的其他一些設置,這些是預設的EF設置,它告訴Code First在哪裡創建資料庫。 由於我們正在映射到現有資料庫,因此我們的應用程式將忽略這些設置。

衍生(派生)DbContext

在項目目錄下添加了一個名為BloggingContext的文件。這是與數據交互的上下文,通過它我們可以從資料庫中查詢數據或保存數據到資料庫。同時,BloggingContext為每一個表公開了一個DbSet<TEntity>屬性。 您還會註意到,預設構造函數使用 name = syntax語法調用基礎構造函數。 這是告訴Code First,應該從配置文件基於連接字元串名稱載入用於此上下文的連接字元串。

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

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    } 
}

當您在配置文件中使用連接字元串時,應始終使用name = syntax。 這樣可以確保如果連接字元串不存在,那麼Entity Framework將拋出異常而不是按照慣例創建一個新的資料庫。

實體模型類

最後,一個BlogPost類也被添加到項目中。 這些是構成我們模型的實體類。 你將看到應用於類的數據模型標識配置,其中Code First約定與現有資料庫的結構不一致。 例如,你在Blog.NameBlog.Url上看到StringLength特性,因為它們在資料庫中的最大長度為200(Code First 預設是使用資料庫提供程式支持的最大長度 - nvarchar(max))(你可以嘗試一下用Code First創建一個新的數據表,其中的string類型欄位不用StringLengthMaxLength進行標識,你會發現,在資料庫中自動生成的這個欄位的類型就是nvarchar(max))。

public partial class Blog 
{ 
    public Blog() 
    { 
        Posts = new HashSet<Post>(); 
    } 
 
    public int BlogId { get; set; } 
 
    [StringLength(200)] 
    public string Name { get; set; } 
 
    [StringLength(200)] 
    public string Url { get; set; } 
 
    public virtual ICollection<Post> Posts { get; set; } 
}

4.讀寫數據

現在,數據模型的逆向工程完成了,是時候與資料庫交互進行一些數據訪問了。在Main函數中實現如下代碼:

這段代碼的意思是創建一個新的 DbContext的對象實例,再用它去插入一個新的Blog對象到資料庫.再用Linq to Sql 從資料庫中查詢所有的Blogs,並按 Name 屬性排序。 在此過程中你完全感覺不到你在操作資料庫,是的,你就是在操作面向對象語言,EF幫你實現了與資料庫的所有交互

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 Blog
All blogs in the database:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...

Customizing the Scaffolded Code

For information on customizing the code that is generated by the wizard, see Customizing Code First to an Existing Database.

What if My Database Changes?

The Code First to Database wizard is designed to generate a starting point set of classes that you can then tweak and modify. If your database schema changes you can either manually edit the classes or perform another reverse engineer to overwrite the classes.

Using Code First Migrations with an Existing Database

If you want to use Code First Migrations with your existing database, see Code First Migrations with an existing database.

Summary

In this walkthrough we looked at Code First development using an existing database. We used the Entity Framework Tools for Visual Studio to reverse engineer a set of classes that mapped to the database and could be used to store and retrieve data.


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

-Advertisement-
Play Games
更多相關文章
  • 在數據倉庫的數據模型設計過程中,經常會遇到這樣的需求: 1. 數據量比較大;2. 表中的部分欄位會被update,如用戶的地址,產品的描述信息,訂單的狀態等等;3. 需要查看某一個時間點或者時間段的歷史快照信息,比如,查看某一個訂單在歷史某一個時間點的狀態, 比如,查看某一個用戶在過去某一段時間內, ...
  • 註意: 1.使用phpMyAdmin創建存儲過程時定界符要改成‘//’。 2.只能在資料庫管理工具創建存儲過程,不能用php動態創建,php只能調用存儲過程,連接時後面要加上參數 存儲過程 存儲過程簡單來說,就是為以後的使用而保存的一條或多條MySQL語句的集合。可將其視為批件,雖然它們的作用不僅限 ...
  • 討人喜歡的 MySQL replace into 用法(insert into 的增強版) 在向表中插入數據的時候,經常遇到這樣的情況:1. 首先判斷數據是否存在; 2. 如果不存在,則插入;3.如果存在,則更新。 在 SQL Server 中可以這樣處理: if not exists (selec ...
  • - 在芝加哥工作的人中,誰的工資最高select * from(select e.ename from emp e join dept d on(e.deptno = d.deptno)where d.loc='CHICAGO' order by sal desc) where rownum=1; ...
  • MySQL Database on Azure 是 Azure 平臺上推出的 MySQL 雲資料庫服務,通過全面相容 MySQL 協議,為用戶提供了一個全托管的性能穩定、可快速部署、高可用、高安全性的資料庫服務。客戶可以使用常見的支持 MySQL 的平臺與技術進行開發與集成。本文演示瞭如何使用 My ...
  • 事務用於處理數據的一致性,事務的定義是,處於同一個事務中的操作是一個工作單元,要麼全部執行成功,要麼全部執行失敗。把事務的概念應用到在實際的SSIS Package場景中,如何在Package中實現事務,事務的行為是什麼樣的,你真的瞭解嗎? SSIS預設支持Task組件級別的事務,在預設情況下,單個 ...
  • 如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持! 少年入門筆記,整理出來一起入坑!入門的視屏來自imooc的:http://www.imooc.com/learn/839 如果轉載,請註明博文來源: www.cnblogs. ...
  • 打開網址可以看到這是一個類似chm格式但可以線上瀏覽的參考手冊,非常的完美,該手冊詳細講解了:如何安裝mysql,MySQL管理器,查詢瀏覽器,移植工具包,以及sql語句語法,優化,函數和操作符,存儲引擎和表類型等等內容,是學習mysq必備的參考手冊,能夠讓廣大網友們更好更輕鬆的掌握mysql資料庫... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...