本视频和分步演练介绍了使用 Entity Framework 进行数据库优先开发。 Database First 允许从现有数据库反向工程模型。 模型存储在 EDMX 文件 (.edmx 扩展名)中,可以在实体框架设计器中查看和编辑。 在应用程序中与你交互的类是从 EDMX 文件自动生成的。
观看视频
此视频介绍使用 Entity Framework 进行 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 作为数据源
安装了 LocalDB 或 SQL Express 的情况下,与之连接,然后输入 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 作为连接字符串的名称,然后单击“下一步”
单击“表”旁边的复选框以导入所有表,然后单击“完成”
反向工程过程完成后,新模型将添加到项目中,并打开可在实体框架设计器中查看。 App.config 文件也已添加到项目中,其中包含数据库的连接详细信息。
Visual Studio 2010 中的其他步骤
如果在 Visual Studio 2010 中工作,则需要执行一些其他步骤才能升级到最新版本的 Entity Framework。 升级非常重要,因为它使你能够访问改进的 API 图面,这更易于使用,以及最新的 bug 修复。
首先,我们需要从 NuGet 获取最新版本的 Entity Framework。
- 项目–> 管理 NuGet 包...如果没有 “管理 NuGet 包...” 选项,则应安装 最新版本的 NuGet
- 选择“ 联机 ”选项卡
- 选择 EntityFramework 包
- 单击“安装”
接下来,我们需要交换模型以生成使用 DbContext API 的代码,该 API 是在更高版本的 Entity Framework 中引入的。
在 EF 设计器中右键单击模型的空位置,然后选择 “添加代码生成项...”
从左侧菜单中选择 “联机模板 ”并搜索 DbContext
选择 适用于 C# 的 EF 5.x DbContext 生成器,输入 BloggingModel 作为名称,然后单击“ 添加”
4. 读取和写入数据
现在,我们有一个模型,是时候使用它来访问某些数据了。 我们将用于访问数据的类是根据 EDMX 文件自动生成的。
此屏幕截图来自 Visual Studio 2012,如果您使用 Visual Studio 2010,BloggingModel.tt 和 BloggingModel.Context.tt 文件将直接位于项目下,而不是嵌套在 EDMX 文件下。
在Program.cs中实现 Main 方法,如下所示。 此代码创建上下文的新实例,然后使用它插入新的博客。 然后,它使用 LINQ 查询从按 Title 按字母顺序排序的数据库检索所有博客。
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 设计器中模型的空位置并选择“从数据库更新模型...”,这将启动更新向导
在更新向导的“添加”选项卡上,选中“表”旁边的框,这表示我们想从架构中添加任何新的表。 “刷新”选项卡显示模型中的任何现有表,这些表将在更新期间检查是否有更改。 “删除”选项卡显示已从架构中删除的任何表,并将在更新过程中从模型中删除。 自动检测这两个选项卡上的信息,仅供参考,不能更改任何设置。
在更新向导上单击“完成”
模型现已更新,以包含映射到我们添加到数据库的 Users 表的新用户实体。
总结
在本演练中,我们了解了 Database First 开发,这使我们能够基于现有数据库在 EF Designer 中创建模型。 然后,我们使用该模型从数据库读取和写入一些数据。 最后,我们更新了模型,以反映我们对数据库架构所做的更改。