Entity Framework Core 在 .NET 4.6 與 .NET Core 的初體驗

  • 760
  • 0
  • 2016-09-17

這篇會使用 Visual Studio 2015 + .NET 4.6.2 建立 Console 程式來嘗試 EF Core,

同時也會使用 dotnet + .NET Core 1.0 建立 Console 程式來嘗試 EF Core。

 

Visual Studio 2015 或 Visual Studio Code 只是整合開發工具,與搭配哪種 Framework(.NET Core 1.0, .NET Framework 4.6) 是沒有限制的。

讓我們從熟悉的 Visual Studio 2015 開始吧!

1. 建立新的 Console 專案

2. 打開 Package Manager Console

3. 安裝 Microsoft.EntityFrameworkCore.SqlServer 套件( 能連接 SqlServer 的 EF Core 核心套件 )

Install-Package Microsoft.EntityFrameworkCore.SqlServer

 4. 安裝 Microsoft.EntityFrameworkCore.Tools ( 像是 migration 指令會用到 )

Install-Package Microsoft.EntityFrameworkCore.Tools –Pre

5. 建立一個 Models.cs 類別,裡面放 EF 要建立資料庫相關代碼,

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFCoreNET462
{
	public class Ex1Context : DbContext
	{
		public DbSet<Order> Orders { get; set; }
		public DbSet<OrderDetail> OrderDetails { get; set; }

		protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
		{
			optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFCoreExample1DB;Trusted_Connection=True;");
		}
	}

	public class Order
	{
		public int OrderId { get; set; }
		public DateTime CreateDate { get; set; }
		public List<OrderDetail> Details { get; set; }
	}

	public class OrderDetail
	{
		public int OrderDetailId { get; set; }
		public string ProductNo { get; set; }

		public int OrderId { get; set; }
		public Order Order { get; set; }
	}
}

6. 在 Package Manager Console 輸入 

Add-Migration MyFirstMigration

這個會建立 Migrations 資料夾,裡面包含 ModelSnapshot.cs 結尾的檔案與 時間戳_MyFirstMigration.cs,

主要是這個指令會偵測程式碼中的 Ex1Context  相關代碼,去產生這些與資料庫結構有關的代碼

7. 接著一樣在 Package Manager Console 輸入

Update-Database

這個動作就會依照 Migrations 的設定,建立資料庫與 Tables

8. 在 Program.cs 加入以下代碼

using System;
using System.Linq;

namespace EFCoreNET462
{
	class Program
	{
		static void Main(string[] args)
		{
			using (var db = new Ex1Context())
			{
				if (! db.Orders.Any())
				{
					db.Orders.Add(new Order
					{
						 CreateDate = DateTime.Now
					});

					db.SaveChanges();
				}

				var list = db.Orders.ToList();
				foreach (var item in list)
				{
					Console.WriteLine($"{item.OrderId}: {item.CreateDate}");
				}
				Console.Read();
			}
		}
	}
	
}

 執行後應該會看到 


接著換 dotnet,其中若想寫程式的部分,可以用 Visual Studio Code,

1. 用命令提示字元建立先建立要放專案檔案的資料夾,並切換資料夾

mkdir EFCoreNETCore10
cd EFCoreNETCore10

2. 然後建立專案,然後第一次記得都要還原套件

dotnet new
dotnet restore

 3. 在用 Visual Studio Code 的指令來開啟(或用記事本編輯也可)

code .

4. project.json 加入 Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Design、Microsoft.EntityFrameworkCore.Tools

{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {
    "Microsoft.EntityFrameworkCore.SqlServer":"1.0.1",
    "Microsoft.EntityFrameworkCore.Design": {
      "version": "1.0.0-preview2-final",
      "type": "build" 
    }
  },
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0"
        }
      },
      "imports": "dnxcore50"
    }
  },
  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final" 
  } 
}
記得每次要是有異動 project.json 中的參考要用 dotnet restore 還原套件一下哦

5. 建立 models.cs 加入以下代碼

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;

namespace EFCoreNETCore10
{
    public class Ex1Context : DbContext
    {
        public DbSet<Order> Orders { get; set; }
        public DbSet<OrderDetail> OrderDetails { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFCoreExample2DB;Trusted_Connection=True;");
        }
    }

    public class Order
    {
        public int OrderId { get; set; }
        public DateTime CreateDate { get; set; }
        public List<OrderDetail> Details { get; set; }
    }

    public class OrderDetail
    {
        public int OrderDetailId { get; set; }
        public string ProductNo { get; set; }

        public int OrderId { get; set; }
        public Order Order { get; set; }
    }
}

6. 用命令提示字元建立 migrations

dotnet ef migrations add MyFirstMigration
預設專案是沒有 namespace 的,要做 migration 的話,要加上 namespace,不然會有錯誤訊息

7. 在將資料庫建立起來

dotnet ef database update

8. Program.cs 加入測試代碼

using System;
using System.Linq;

namespace EFCoreNETCore10
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new Ex1Context())
            {
                if (!db.Orders.Any())
                {
                    db.Orders.Add(new Order
                    {
                        CreateDate = DateTime.Now
                    });

                    db.SaveChanges();
                }

                var list = db.Orders.ToList();
                foreach (var item in list)
                {
                    Console.WriteLine($"{item.OrderId}: {item.CreateDate}");
                }
                Console.Read();
            }
        }
    }

}

9. 執行看看

dotnet run


參考文章

Console Application to New Database
讓我們 Core 在一起:ASP.NET Core & .NET Core