本视频和分步演练介绍如何使用实体框架进行 Model First 开发。 Model First 允许你使用实体框架设计器创建新模型,然后从该模型生成数据库架构。 模型存储在 EDMX 文件(.edmx 扩展名)中,可以在实体框架设计器中查看和编辑。 你在应用程序中与之交互的类是从 EDMX 文件自动生成的。
观看视频
本视频和分步演练介绍如何使用实体框架进行 Model First 开发。 Model First 允许你使用实体框架设计器创建新模型,然后从该模型生成数据库架构。 模型存储在 EDMX 文件(.edmx 扩展名)中,可以在实体框架设计器中查看和编辑。 你在应用程序中与之交互的类是从 EDMX 文件自动生成的。
主讲人:Rowan Miller
先决条件
需要安装 Visual Studio 2010 或 Visual Studio 2012 才能完成本演练。
如果使用 Visual Studio 2010,还需要安装 NuGet。
1. 创建应用程序
为简单起见,我们将生成一个使用 Model First 进行数据访问的基本控制台应用程序:
- 打开 Visual Studio
- “文件”->“新建”->“项目…”
- 从左侧菜单中选择“Windows”并选择“控制台应用程序”
- 输入 ModelFirstSample 作为名称
- 选择“确定”
2. 创建模型
我们将使用 Visual Studio 中包含的实体框架设计器来创建模型。
“项目”->“添加新项...”
从左侧菜单中选择“数据”,然后选择“ADO.NET 实体数据模型”
输入 BloggingModel 作为名称并单击“确定”,这将启动实体数据模型向导
选择“空模型”并单击“完成”
实体框架设计器以空白模型打开。 现在,我们可以开始向模型添加实体、属性和关联。
右键单击设计图面并选择“属性”
在“属性”窗口中,将“实体容器名称”更改为 BloggingContext。这是将为你生成的派生上下文的名称,该上下文表示与数据库的会话,允许我们查询和保存数据
右键单击设计图面并选择“添加新项”->“实体...”
输入 Blog 作为实体名称,输入 BlogId 作为键名称,然后单击“确定”
右键单击设计图面上的新实体并选择“添加新项”->“标量属性”,输入 Name 作为属性名称。
重复此过程以添加 URL 属性。
右键单击设计图面上的 URL 属性并选择“属性”,在“属性”窗口中将“可为 null” 设置更改为 True。这样,我们无需为 Blog 分配 URL 即可将其保存到数据库中
使用刚刚学到的方法,添加一个具有 PostId 键属性的 Post 实体
向 Post 实体添加 Title 和 Content 标量属性
我们已经拥有了几个实体,现在可以在它们之间添加关联(或关系)。
右键单击设计图面并选择“添加新项”->“关联...”
使关系的一端指向 Blog,多重性为“一”,另一端指向 Post,多重性为“多”。这意味着一个 Blog 有多个 Post,而一个 Post 属于一个 Blog
确保选中“将外键属性添加到“Post”实体”框,然后单击“确定”
我们现在有一个简单的模型,可以从中生成数据库并用于读取和写入数据。
Visual Studio 2010 中的其他步骤
如果使用 Visual Studio 2010,则需要执行一些额外的步骤才能升级到最新版本的实体框架。 升级很重要,因为它使你可以访问最新的 bug 修复,以及改进后的 API 图面,该图面更易于使用。
首先,我们需要从 NuGet 获取最新版本的实体框架。
- “项目”–>“管理 NuGet 包...”如果没有“管理 NuGet 包...”选项,则应安装最新版本的 NuGet
- 选择“联机”选项卡
- 选择 EntityFramework 包
- 单击“安装”
接下来,我们需要交换模型,以生成使用 DbContext API 的代码,该 API 是在实体框架的较高版本中引入的。
在 EF 设计器中右键单击模型的空白处,然后选择“添加代码生成项...”
从左侧菜单中选择“联机模板”并搜索“DbContext”
选择“适用于 C# 的 EF 5.x DbContext 生成器”,输入 BloggingModel 作为名称,然后单击“添加”
3. 生成数据库
根据我们的模型,实体框架可以计算出一个数据库架构,该架构允许我们使用模型来存储和检索数据。
随 Visual Studio 安装的数据库服务器因你安装的 Visual Studio 版本而异:
- 如果使用 Visual Studio 2010,你将创建一个 SQL Express 数据库。
- 如果使用 Visual Studio 2012,你将创建一个 LocalDB 数据库。
接下来,生成数据库。
右键单击设计图面并选择“从模型生成数据库...”
单击“新建连接...”并指定 LocalDB 或 SQL Express(具体取决于你使用的 Visual Studio 版本),输入 ModelFirst.Blogging 作为数据库名称。
选择“确定”,系统会询问你是否要创建新数据库,请选择“是”
选择“下一步”,实体框架设计器将计算脚本以创建数据库架构
显示脚本后,单击“完成”,脚本将添加到项目并打开
右键单击脚本并选择“执行”,系统会提示你指定要连接到的数据库,指定 LocalDB 或 SQL Server Express(具体取决于你使用的 Visual Studio 版本)
4.读取和写入数据
现在我们拥有一个模型,可用它访问某些数据。 我们将用于访问数据的类是根据 EDMX 文件自动生成的。
此屏幕截图来自 Visual Studio 2012,如果你使用的是 Visual Studio 2010,BloggingModel.tt 和 BloggingModel.Context.tt 文件将直接位于项目下,而不是嵌套在 EDMX 文件下。
在 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. 处理模型更改
现在可以对模型进行一些更改,当我们进行这些更改时,还需要更新数据库架构。
首先,我们将向模型添加新的 User 实体。
添加一个新的 User 实体名称,将 Username 作为键名,String 作为键的属性类型
右键单击设计图面上的 Username 属性并选择“属性”,在“属性”窗口中将 MaxLength 设置更改为 50。这会将可以存储在 username 中的数据限制为 50 个字符
将 DisplayName 标量属性添加到 User 实体
我们现在有一个更新的模型,我们准备更新数据库以适应新的 User 实体类型。
- 右键单击设计图面并选择“从模型生成数据库...”,实体框架将计算脚本,以根据更新的模型重新创建架构。
- 单击“完成”
- 你可能会收到有关覆盖现有 DDL 脚本以及模型的映射和存储部分的警告,对于这两个警告,请单击“是”
- 系统将为你打开用于创建数据库的已更新 SQL 脚本
生成的脚本将删除所有现有表,然后从头开始重新创建架构。 这可能适用于本地开发,但无法将更改推送到已部署的数据库。 如果需要将更改发布到已部署的数据库,你需要编辑脚本或使用架构比较工具来计算迁移脚本。 - 右键单击脚本并选择“执行”,系统会提示你指定要连接到的数据库,指定 LocalDB 或 SQL Server Express(具体取决于你使用的 Visual Studio 版本)
总结
在本演练中,我们研究了 Model First 开发,它允许我们在 EF 设计器中创建模型,然后从该模型生成数据库。 然后,我们使用模型在数据库中读取和写入一些数据。 最后,我们更新了模型,然后重新创建了数据库架构以匹配模型。