對現有資料庫先撰寫程序代碼

本逐步解說提供以現有資料庫為目標之Code First開發的簡介。 Code First 可讓您使用 C# 或 VB.Net 類別來定義模型。 您可以選擇性地使用類別和屬性上的屬性或使用 Fluent API 來執行其他組態。

必要條件

您必須安裝Visual Studio 2012Visual Studio 2013,才能完成本逐步解說。

您也需要安裝 Entity Framework Tools for Visual Studio 6.1 版(或更新版本)。 如需安裝最新版 Entity Framework 工具的資訊,請參閱 取得 Entity Framework

1.建立現有的資料庫

一般而言,當您將目標設為現有的資料庫時,就會建立它,但在本逐步解說中,我們需要建立資料庫才能存取。

讓我們繼續產生資料庫。

  • 開啟 Visual Studio

  • 檢視 -> 伺服器總管

  • 以滑鼠右鍵按兩下 [資料 連線 -> 新增 連線...

  • 如果您尚未從 [伺服器 總管] 連線到資料庫,則必須先選取 [Microsoft SQL Server ] 作為數據源

    Select Data Source

  • 連線 至您的LocalDB實例,然後輸入以資料庫名稱撰寫部落格

    LocalDB Connection

  • 選取 [ 確定 ],系統會詢問您是否要建立新的資料庫,選取 [ 是]

    Create Database Dialog

  • 新的資料庫現在會出現在 [伺服器總管] 中,以滑鼠右鍵按兩下它,然後選取 [ 新增查詢]

  • 將下列 SQL 複製到新的查詢,然後以滑鼠右鍵按下查詢,然後選取 [ 執行]

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
  • 檔案 -> 新增 -> 專案...
  • 從左側選單選取 [Windows] 和 [控制台應用程式]
  • 輸入 CodeFirstExistingDatabaseSample 作為名稱
  • 選取確定

 

3. 反向工程師模型

我們將使用 Entity Framework Tools for Visual Studio 來協助我們產生一些初始程式代碼來對應至資料庫。 這些工具只是產生程序代碼,如果您偏好的話,您也可以手動輸入。

  • 專案 -> 新增專案...

  • 從左側功能表中選取 [數據 ],然後 ADO.NET 實體數據模型

  • 輸入 BloggingContext 作為名稱,然後按兩下 [ 確定]

  • 這會啟動 實體數據模型精靈

  • 從資料庫選取 [程序代碼優先],然後按 [下一步]

    Wizard One CFE

  • 選取您在第一節中建立之資料庫的連線,然後按 [下一步]

    Wizard Two CFE

  • 按兩下 [資料表] 旁的複選框以匯入所有資料表,然後按兩下 [完成]

    Wizard Three CFE

一旦反向工程師程式完成一些專案將新增至專案,讓我們來看看已新增的專案。

組態檔

App.config 檔案已新增至專案,此檔案包含現有資料庫的 連接字串。

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

您也會注意到組態檔中的其他一些設定,這些是預設的 EF 設定,告知 Code First 建立資料庫的位置。 由於我們正在對應至現有的資料庫,因此在我們的應用程式中將會忽略這些設定。

衍生的內容

BloggingContext 類別已新增至專案。 內容代表與資料庫的會話,允許我們查詢和儲存數據。 內容會 針對模型中的每個類型公開 DbSet<TEntity> 。 您也會注意到預設建構函式會使用 name= 語法呼叫基底建構函式。 這會告訴 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= 語法。 這可確保如果 連接字串 不存在,則 Entity Framework 會擲回,而不是依照慣例建立新的資料庫。

模型類別

最後, 部落格Post 類別也已新增至專案。 這些是組成模型的領域類別。 您會看到套用至類別的數據批注,以指定 Code First 慣例與現有資料庫結構不一致的設定。 例如,您會在 Blog.NameBlog.Url看到 StringLength 註釋,因為它們在資料庫中的長度上限為 200 (Code First 預設值是使用 SQL Server 中資料庫提供者支援的長度上限 - 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. 讀取和寫入數據

既然我們有模型,現在是時候使用它來存取某些數據了。 在 Program.cs 中實作 Main 方法,如下所示。 此程式代碼會建立內容的新實例,然後使用它來插入新的 部落格。 然後使用 LINQ 查詢,從依 Title 依字母順序排序的資料庫擷取所有部落格

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...

 

如果我的資料庫變更,該怎麼辦?

Code First to Database 精靈的設計目的是產生一組起點,然後您可以調整和修改類別。 如果您的資料庫架構變更,您可以手動編輯類別,或執行另一個反向工程師來覆寫類別。

使用 Code First 移轉 至現有的資料庫

如果您想要將 Code First 移轉 與現有的資料庫搭配使用,請參閱現有資料庫的 Code First 移轉。

摘要

在本逐步解說中,我們已探討使用現有資料庫進行Code First開發。 我們使用 Entity Framework Tools for Visual Studio 來反向設計一組對應至資料庫的類別,並可用來儲存和擷取數據。