Skip to main content

本视频和分步演练介绍如何使用实体框架进行 Database First 开发。通过 Database First,可以从现有数据库对模型进行反向工程处理。模型存储在一个 EDMX 文件(扩展名为 .edmx)中,可在实体框架设计器中查看和编辑。应用程序中用于交互的类是自动从 EDMX 文件生成的。

更多视频选项 — 包括下载

 

必备条件

要完成本演练,需要安装 Visual Studio 2010 或 Visual Studio 2012。

如果使用的是 Visual Studio 2010,还需要安装 NuGet

 

1.创建现有数据库

通常情况,是面向一个已创建的现有数据库,但在本演练中,我们需要创建一个数据库进行访问。

随 Visual Studio 安装的数据库服务器根据所安装的 Visual Studio 的版本而有所不同:

  • 如果使用 Visual Studio 2010,则将创建 SQL Express 数据库。
  • 如果使用的是 Visual Studio 2012,则将创建 LocalDb 数据库。

 

我们继续生成数据库。

  • 打开 Visual Studio
  • “视图”->“服务器资源管理器”
  • 右键单击“数据连接”->“添加连接...”
  • 如果尚未从服务器资源管理器连接至数据库,则需要选择 Microsoft SQL Server 作为数据源
    选择“Microsoft SQL Server”作为数据源
  • 根据已安装的数据库,连接到 LocalDb ((localdb)\v11.0) 或 SQL Express (.\SQLEXPRESS),然手输入 DatabaseFirst.Blogging 作为数据库名称
    连接到 (localdb)\v11.0 上的 DatabaseFirst.Blogging 数据库连接到 .\SQLEXPRESS 上的 DatabaseFirst.Blogging 数据库
  • 选择“确定”,系统将询问是否要创建新数据库,选择“是”
    询问是否创建新数据库的对话框
  • 新数据库此时出现在服务器资源管理器中,右键单击该数据库,然后选择“新建查询”
  • 将以下 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
);

2.创建应用程序

为简单起见,我们将生成一个基本控制台应用程序,它使用 Database First 执行数据访问:

  • 打开 Visual Studio
  • “文件”->“新建”->“项目…”
  • 从左侧菜单中选择“Windows”和“控制台应用程序”
  • 输入 DatabaseFirstSample 作为名称
  • 选择“确定”

 

3.对模型进行反向工程处理

我们使用 Visual Studio 中的实体框架设计器来创建模型。

  • “项目”->“添加新项...”
  • 从左侧菜单中选择“数据”,然后选择“ADO.NET 实体数据模型”
  • 输入 BloggingModel 作为名称,然后单击“确定”
  • 这会启动实体数据模型向导
  • 选择“从数据库生成”,然后单击“下一步”
    在向导的第一步中选择了“从数据库生成”
  • 选择连接到在第一部分中创建的数据库,输入 BloggingContext 作为连接字符串的名称,然后单击“下一步”
    在向导的第二步中选择了 DatabaseFirst.Blogging 数据库并输入 BloggingContext 作为连接字符串名称
  • 单击“表”旁边的复选框,导入所有表,然后单击“完成”
    在向导的最后一步中选择要导入的所有表

 

反向工程处理完成后,新模型将添加到项目中并在实体框架设计器中打开以便查看。项目中还添加了一个 App.config 文件,其中含有数据库的连接详细信息。

显示包含 Blog 和 Post 实体的模型的 EF 设计器

Visual Studio 2010 中的其他步骤

如果用的是 Visual Studio 2010,则需要执行一些其他步骤升级到实体框架的最新版本。升级十分重要,因为升级后才能访问经过改进的 API 图面以及最新的 Bug 修复,改进的 API 图面使用起来更为方便。

首先,需要从 NuGet 获取实体框架的最新版本。

  • “项目”–>“管理 NuGet 程序包…”
    如果没有“管理 NuGet 程序包...”选项,则应安装 NuGet 的最新版本
  • 选择“联机”选项卡
  • 选择“EntityFramework”程序包
  • 单击“安装”

接下来,需要交换模型,生成利用实体框架的早期版本中引入的 DbContext API 的代码。

  • 在 EF 设计器中,右键单击模型上的空位置,选择“添加代码生成项...”
  • 从左侧菜单中选择“联机模板”,然后搜索“DbContext”
  • 选择“EF 5.x DbContext Generator for C#”,输入名称 BloggingModel,然后单击“添加”
    在“添加代码生成项”对话框中选择了“EF 5.x DbContext Generator for C#”

 

4.读写数据

我们已有了模型,现在可以使用模型来访问一些数据。用于访问数据的类是基于 EDMX 文件自动生成的。

此屏幕快照来自 Visual Studio 2012,如果使用的是 Visual Studio 2010,则 BloggingModel.tt 和 BloggingModel.Context.tt 文件直接位于项目下面,而不是嵌套在 EDMX 文件下面。

展开的解决方案资源管理器,显示生成的代码文件

 

实现 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 Blog
All blogs in the database:
ADO.NET 博客
Press any key to exit...

 

5.处理数据库更改

现在,可以对数据库架构进行一些更改,在进行这些更改时,还需要更新模型,从而反映这些更改。

第一步是对数据库架构进行一些更改。我们将向架构添加一个用户表。

  • 在服务器资源管理器中,右键单击 DatabaseFirst.Blogging 数据库,然后选择“新建查询”
  • 将以下 SQL 复制到新查询中,右键单击该查询,然后选择“执行”
CREATE TABLE [dbo].[Users]
(
	    [Username] NVARCHAR(50) NOT NULL PRIMARY KEY, 
    [DisplayName] NVARCHAR(MAX) NULL
)

在更新架构之后,用这些更改来更新模型。

  • 在 EF 设计器中,右键单击模型上的空位置,然后选择“从数据库更新模型...”,这会启动更新向导
  • 在更新向导的“添加”选项卡上,选中“表”旁边的框,这表示需要从架构添加新表。

    “刷新”选项卡显示出模型中的所有现有表,在更新期间,将检查这些表有无更改。“删除”选项卡显示出已从架构删除并且在更新期间还将从模型删除的所有表。有关这两个选项卡的信息将被自动检测到,并仅出于参考目的而提供,您无法更改任何设置。

    更新向导中选中供导入的新表
  • 单击更新向导上的“完成”

 

模型进行更新,包括映射到我们已添加到数据库的用户表的新 User 实体。

EF 设计器显示包含 Blog、Post 和 User 实体的模型

摘要

本演练介绍了 Database First 开发,通过这种开发,可在 EF 设计器中基于现有数据库创建模型。随后,我们使用模型从数据库读写一些数据。最后,我们更新模型来反映对数据库架构进行的更改。