本分步演练介绍面向现有数据库的 Code First 开发。 Code First 允许使用 C# 或 VB.Net 类定义模型。 可选地,可以通过类和属性上使用特性,或使用 Fluent API 来执行额外的配置。
先决条件
需要安装 Visual Studio 2012 或 Visual Studio 2013 才能完成本演练。
还需要安装适用于 Visual Studio 的 Entity Framework Tools 版本 6.1(或更高版本)。 请参阅 获取 Entity Framework 以了解有关如何安装最新版本 Entity Framework 工具的信息。
1.创建现有数据库
通常,当你针对现有数据库时,该数据库已创建,但在本教程中,我们需要创建一个可供访问的数据库。
让我们继续生成数据库。
打开 Visual Studio
视图 -> 服务器资源管理器
右键单击 数据连接 -> 添加连接...
如果尚未从 服务器资源管理器 连接到数据库,则需要选择 Microsoft SQL Server 作为数据源
连接到 LocalDB 实例,并输入 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
);
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')
2. 创建应用程序
为了简单起见,我们将构建一个使用 Code First 执行数据访问的基本控制台应用程序:
- 打开 Visual Studio
- 文件 -> 新建 -> 项目...
- 从左侧菜单和控制台应用程序选择 Windows
- 输入 CodeFirstExistingDatabaseSample 作为名称
- 选择 “确定”
3. 反向工程模型
我们将使用适用于 Visual Studio 的 Entity Framework 工具来帮助生成一些初始代码以映射到数据库。 这些工具只是生成代码,如果你愿意,也可以手动键入。
项目 -> 添加新项...
从左侧菜单中选择 “数据” ,然后 ADO.NET 实体数据模型
输入 BloggingContext 作为名称,然后单击“ 确定”
这会启动 实体数据模型向导
从数据库选择“第一个代码”,然后单击“下一步”
选择与在第一节中创建的数据库的连接,然后单击“下一步”
单击表旁边的复选框以导入所有表,然后单击“完成”
完成反向工程过程后,一些项目将被添加到工程中,让我们看看都添加了哪些内容。
配置文件
App.config 文件已添加到项目中,此文件包含现有数据库的连接字符串。
<connectionStrings>
<add
name="BloggingContext"
connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
配置文件中也会发现一些其他设置,这些设置是默认的 EF 设置,告知 Code First 在何处创建数据库。 由于我们正在映射到现有数据库,因此,这些设置将忽略在我们的应用程序中。
派生上下文
BloggingContext 类已添加到项目中。 上下文表示与数据库的会话,使我们能够查询和保存数据。 该上下文会为模型中的每种类型公开一个 DbSet<TEntity>。 你还将注意到,默认构造函数使用 name= 语法调用基构造函数。 这会告知 Code First,应从配置文件加载要用于此上下文的连接字符串。
public partial class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingContext")
{
}
public virtual DbSet<Blog> Blogs { get; set; }
public virtual DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
在配置文件中使用连接字符串时,应始终使用 name= 语法。 这可确保如果连接字符串不存在,实体框架将抛出异常,而不是按约定创建新数据库。
模型类
最后,博客和文章类也已添加到项目中。 这些是构成模型的域类。 你将看到应用于类的数据注释,以指定 Code First 约定与现有数据库的结构不一致的配置。 例如,你将在 Blog.Name 和 Blog.Url 上看到 StringLength 注释,因为它们在数据库中的最大长度为 200(Code First 默认值是使用 SQL Server 中数据库提供程序 -nvarchar(max)支持的最大长度)。
public partial class Blog
{
public Blog()
{
Posts = new HashSet<Post>();
}
public int BlogId { get; set; }
[StringLength(200)]
public string Name { get; set; }
[StringLength(200)]
public string Url { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
4. 读取和写入数据
现在,我们有一个模型,是时候使用它来访问某些数据了。 在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:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...
如果数据库发生更改,该怎么办?
Code First to Database 向导旨在生成一组起点类,然后可以对其进行调整和修改。 如果数据库架构发生更改,可以手动编辑类或执行另一个反向工程来覆盖这些类。
使用 Code First Migrations 对现有数据库进行迁移
如果要将 Code First 迁移与现有数据库配合使用,请参阅 Code First 迁移到现有数据库。
总结
在本演练中,我们了解了使用现有数据库进行 Code First 开发。 我们使用适用于 Visual Studio 的 Entity Framework 工具反向设计一组映射到数据库的类,并可用于存储和检索数据。