要完成本演練,需要安裝 Visual Studio 2010 或 Visual Studio 2012。
如果使用的是 Visual Studio 2010,還需要安裝 NuGet。
簡單起見,我們將構建一個使用 Code First 執行數據訪問的基本控制台應用程序。
我們使用類來定義一個非常簡單的模型。在 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)。這將啟用實體框架的延遲加載功能。延遲加載意味著,嘗試訪問這些屬性的內容時,將自動從數據庫加載。
現在,可以定義派生上下文,用於表示數據庫的一個會話,以便我們查詢和保存數據。我們定義一個派生自 System.Data.Entity.DbContext 的上下文,並為模型中的每個類公開一個類型化 DbSet<TEntity>。
現在,開始使用來自實體框架的類型。因此,我們需要添加 EntityFramework NuGet 程序包。
在 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; }
}
}
這是我們開始存儲和檢索數據所需的全部代碼。顯然,後台發生了許多事情。稍後,我們將進行了解。但是,首先讓我們看看它是如何運行的。
實現 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 博客
按照約定,DbContext 已經創建了一個數據庫。
這些僅僅是默認約定,除此之外,還有多種方式可更改 Code First 所用的數據庫。有關更多信息,請參見DbContext 如何發現模型和數據庫連接 主題。
可以在 Visual Studio 中使用服務器資源管理器連接至此數據庫
現在,可以檢查 Code First 已經創建的架構。
DbContext 通過查看我們定義的 DbSet 屬性,了解模型包含哪些類。隨後,它使用 Code First 約定的默認集來確定表和列的名稱,確定數據類型,查找主鍵等。本演練稍後將介紹如何重寫這些約定。
現在更改模型,當我們進行更改時,還需要更新數據庫架構。為此,我們使用一個稱為“Code First 遷移”(或簡稱“遷移”)的功能。
“遷移”是一組有序的步驟,描述如何升級(和降級)數據庫架構。這些步驟(稱為“遷移”)中的每個步驟均包含一些代碼,用於描述要應用的更改。
第一步是為 BloggingContext 啟用 Code First 遷移。
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; }
}
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");
}
}
}
新的 Url 列已添加至數據庫中的 Blogs 表:
到目前為止,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; }
}
using System.ComponentModel.DataAnnotations;
public class User
{
[Key]
public string Username { get; set; }
public string DisplayName { get; set; }
}
現在,新表已添加至數據庫:
EF 支持的完整注釋列表為:
上一節介紹了如何使用數據注釋來補充或重寫按約定檢測的內容。另一種模型配置方法是通過 Code First Fluent API。
大多數模型配置都可使用簡單數據注釋進行。Fluent API 是一種更高級的方法,除某些數據注釋不可能支持的更高級配置外,可以指定包含數據注釋所有功能的模型配置。數據注釋和 Fluent API 可一起使用。
要訪問 Fluent API,需要在 DbContext 中重寫 OnModelCreating 方法。假設我們需要重命名 User.DisplayName 存儲至 display_name 的列。
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");
}
}
DisplayName 列現在重命名為 display_name:
本演練介紹了如何使用新數據庫進行 Code First 開發。我們用類定義一個模型,然後使用該模型創建一個數據庫,然後存儲和檢索數據。數據庫創建之後,我們使用 Code First 遷移將架構更改為我們發展後的模型。此外還介紹了如何使用數據注釋和 Fluent API 來配置模型。