Entity Framework 6.1.0 Tools for Visual Studio

摘要:Entity Framework 6.1.0 Tools for Visual Studio 2012 & 2013 已經可以下載了,來看看有什麼新東西....

Entity Framework 6.1.0 Tools for Visual Studio 2012 & 2013 已經於兩周前開放下載。安裝完成後,專案範本裡面可以看到一些變化。這裡用幾張 Visual Studio 2013 的截圖來比較安裝此工具前後的差異。

安裝前

在 Add New Item 對話窗裡面,原本是:


名稱預設會採用 .edmx 副檔名。點 Add 按鈕之後只有兩種範本可選:


安裝後

安裝 EF 6.1.0 Tools 之後,Add New Item 對話窗有一點小變化:


注意其中的 Name 欄位已經不會有預設的 .edmx 副檔名。這是因為增加了 Code First 模型範本,所以得等到下一個步驟,確定你選取了模型範本之後,才能決定要產生何種類型的檔案。

點 Add 鈕進入下一個步驟,裡面多出兩個選項:Empty Code First model 和 Code First from database。如下圖:


就我自己來說,平常仍以先有資料庫再產生 entity 類別的情形居多,因此看到 Code First from database(或稱為 Code Second)的設計方式已由微軟官方提供,是覺得挺開心的。

Entity Classes

下圖是利用 Code First from database 範本產生程式碼之後,Solution Explorer 中顯示的檔案清單:


這些由範本所產生的程式碼提供了一個很好的基礎,讓我們可以開始使用 Code First 的方式來發展模型。注意看一下這些程式碼,你不會在裡面看到任何警告你「不要修改這裡,以免發生錯誤。」的註解。這些由逆向工程所產生出來的 entity classes 本來就是要讓你修改的。

這裡摘列其中兩個類別的程式碼,以便參考。

首先是繼承自 DbContext 的 NorthwindModel 類別:

namespace DemoData.Models
{
    using System;
    using System.Data.Entity;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;

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

        public virtual DbSet<Customer> Customers { get; set; }
        public virtual DbSet<Order> Orders { get; set; }
        public virtual DbSet<Order_Detail> Order_Details { get; set; }
        public virtual DbSet<Product> Products { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Customer>()
                .Property(e => e.CustomerID)
                .IsFixedLength();

            modelBuilder.Entity<Order_Detail>()
                .Property(e => e.UnitPrice)
                .HasPrecision(19, 4);

            modelBuilder.Entity<Order>()
                .Property(e => e.CustomerID)
                .IsFixedLength();

            modelBuilder.Entity<Order>()
                .Property(e => e.Freight)
                .HasPrecision(19, 4);

            modelBuilder.Entity<Order>()
                .HasMany(e => e.Order_Details)
                .WithRequired(e => e.Order)
                .WillCascadeOnDelete(false);
        }
    }
}

在呼叫父類別的建構函式時,傳入 "name=Northwind" 表示應用程式組態檔案裡面的 <connectionStrings> 元素裡面必須要有一個名稱為 "Northwind" 的連線字串。

另外值得注意的是 OnModelCreating 函式,這裡使用了 Fluent API 來設定 entity 的相關屬性。

除了在 DbContext 類別的 OnModelCreating 方法中利用 Fluent API 來設定 entities,還有一種寫法是在各 entity 類別中使用資料標記(Data Annotations)。參考底下的 Customer 類別:

namespace DemoData.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    public partial class Customer
    {
        public Customer()
        {
            Orders = new HashSet<Order>();
        }

        [StringLength(5)]
        public string CustomerID { get; set; }

        [Required]
        [StringLength(40)]
        public string CompanyName { get; set; }

        [StringLength(60)]
        public string Address { get; set; }

        [StringLength(15)]
        public string City { get; set; }

        [StringLength(10)]
        public string PostalCode { get; set; }

        [StringLength(24)]
        public string Phone { get; set; }

        public virtual ICollection<Order> Orders { get; set; }
    }
}

在 entity 類別中使用資料標記的一個好處是別的地方也用得著,例如 MVC 的模型資料驗證。

官方網站有教學影片和更詳細的介紹,可參考這篇:Code First to an Existing Database

延伸閱讀
Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor