Database First

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

观看视频

此视频介绍如何使用实体框架进行 Database First 开发。 Database First 允许你从现有数据库对模型实施反向工程。 模型存储在 EDMX 文件(.edmx 扩展名)中,可以在实体框架设计器中查看和编辑。 你在应用程序中与之交互的类是从 EDMX 文件自动生成的。

主讲人Rowan Miller

视频WMV | MP4 | WMV (ZIP)

先决条件

至少需要安装 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 作为数据源

    Select Data Source

  • 连接到 LocalDB 或 SQL Express,具体取决于你安装的是哪一个,然后输入 DatabaseFirst.Blogging 作为数据库名称

    Sql Express Connection DF

    LocalDB Connection DF

  • 选择“确定”,系统会询问你是否要创建新数据库,请选择“是”

    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
);

2. 创建应用程序

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

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

 

3. 对模型实施反向工程

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

  • “项目”->“添加新项...”

  • 从左侧菜单中选择“数据”,然后选择“ADO.NET 实体数据模型”

  • 输入 BloggingModel 作为名称并单击“确定”

  • 此操作将启动实体数据模型向导

  • 选择“从数据库生成”,然后单击“下一步”

    Wizard Step 1

  • 选择与你在第一部分创建的数据库建立的连接,输入 BloggingContext 作为连接字符串的名称,然后单击“下一步”

    Wizard Step 2

  • 单击“表”旁边的复选框以导入所有表,然后单击“完成”

    Wizard Step 3

 

反向工程完成后,会将新模型添加到项目中并打开,以便在 Entity Framework Designer 中查看。 App.config 文件也已添加到项目中,其中包含数据库的连接详细信息。

Model Initial

Visual Studio 2010 中的其他步骤

如果使用 Visual Studio 2010,则需要执行一些额外的步骤才能升级到最新版本的实体框架。 升级很重要,因为它使你可以访问最新的 bug 修复,以及改进后的 API 图面,该图面更易于使用。

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

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

接下来,我们需要交换模型,以生成使用 DbContext API 的代码,该 API 是在实体框架的较高版本中引入的。

  • 在 EF 设计器中右键单击模型的空白处,然后选择“添加代码生成项...”

  • 从左侧菜单中选择“联机模板”并搜索“DbContext”

  • 选择“适用于 C# 的 EF 5.x DbContext 生成器”,输入 BloggingModel 作为名称,然后单击“添加”

    DbContext Template

 

4.读取和写入数据

现在我们拥有一个模型,可用它访问某些数据。 我们将用于访问数据的类是根据 EDMX 文件自动生成的。

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

Generated Classes DF

 

在 Program.cs 中实现 Main 方法,如下所示。 此代码创建一个新的上下文实例,然后使用它来插入新的 Blog。 接着,它使用 LINQ 查询从数据库中检索按标题字母顺序排序的所有 Blog。

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 Blog
Press any key to exit...

 

5. 处理数据库更改

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

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

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

架构已更新,现在可以使用这些更改更新模型。

  • 在 EF 设计器中右键单击模型的空白处,然后选择“从数据库更新模型...”,这将启动更新向导

  • 在更新向导的“添加”选项卡上,选中“表”旁边的框,这表示我们要从架构中添加任意新表。 “刷新”选项卡显示模型中的所有现有表,系统将在更新期间检查这些表中的更改。 “删除”选项卡显示已从架构中删除的所有表,在更新期间,系统也会从模型中删除这些表。 这两个选项卡上的信息是自动检测到的,仅供参考,你无法更改任何设置。

    Refresh Wizard

  • 在更新向导中单击“完成”

 

该模型现在更新为包含一个新的 User 实体,该实体映射到我们添加到数据库中的 Users 表。

Model Updated

总结

在本演练中,我们研究了 Database First 开发,它允许我们基于现有数据库在 EF 设计器中创建模型。 然后,我们使用该模型在数据库中读取和写入一些数据。 最后,我们更新了模型,以反映我们对数据库架构所做的更改。