Code First 到现有数据库Code First to an Existing Database

此视频和分步演练提供了面向现有数据库 Code First 开发的简介。 Code First 允许使用 C# 或 VB.Net 类定义模型。 另外,还可以使用类和属性上的属性或使用 Fluent API 来执行其他配置。

观看视频Watch the video

此视频现在适用于第9频道

先决条件Pre-Requisites

你将需要安装Visual Studio 2012Visual Studio 2013才能完成此演练。

还需要安装适用于 Visual Studio 的 Entity Framework Tools 6.1 (或更高版本)。 有关安装最新版本的 Entity Framework Tools 的信息,请参阅获取实体框架

1. 创建现有数据库1. Create an Existing Database

通常,当目标为现有数据库时,它将被创建,但在本演练中,我们需要创建一个要访问的数据库。

接下来,生成数据库。

  • 打开 Visual Studio

  • 视图-> 服务器资源管理器

  • 右键单击 “数据连接-> 添加连接 …

  • 如果尚未从服务器资源管理器连接到数据库,则需要选择Microsoft SQL Server作为数据源

    选择数据源

  • 连接到 LocalDB 实例,并输入博客作为数据库名称

    LocalDB 连接

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

    "创建数据库" 对话框

  • 新数据库现在将出现在服务器资源管理器中,右键单击该数据库并选择 “新建查询

  • 将以下 SQL 复制到新的查询中,然后右键单击该查询,然后选择 “执行

  1. CREATE TABLE [dbo].[Blogs] (
  2. [BlogId] INT IDENTITY (1, 1) NOT NULL,
  3. [Name] NVARCHAR (200) NULL,
  4. [Url] NVARCHAR (200) NULL,
  5. CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
  6. );
  7. CREATE TABLE [dbo].[Posts] (
  8. [PostId] INT IDENTITY (1, 1) NOT NULL,
  9. [Title] NVARCHAR (200) NULL,
  10. [Content] NTEXT NULL,
  11. [BlogId] INT NOT NULL,
  12. CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
  13. CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
  14. );
  15. INSERT INTO [dbo].[Blogs] ([Name],[Url])
  16. VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')
  17. INSERT INTO [dbo].[Blogs] ([Name],[Url])
  18. VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')

2. 创建应用程序2. Create the Application

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

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

3. 反向工程模型3. Reverse Engineer Model

我们将使用适用于 Visual Studio 的 Entity Framework Tools 帮助我们生成一些用于映射到数据库的初始代码。 这些工具只是生成代码,你也可以根据需要手动键入代码。

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

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

  • 输入 “bloggingcontext” 作为名称,然后单击 “确定”

  • 这将启动实体数据模型向导

  • 选择 “从数据库 Code First “,然后单击 “下一步

    向导 One CFE

  • 选择与在第一部分中创建的数据库的连接,然后单击 “下一步

    向导两个 CFE

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

    向导三个 CFE

反向工程过程完成后,会向项目中添加大量项目,让我们看看添加的内容。

配置文件Configuration file

已将 App.config 文件添加到项目中,此文件包含现有数据库的连接字符串。

  1. <connectionStrings>
  2. <add
  3. name="BloggingContext"
  4. connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
  5. providerName="System.Data.SqlClient" />
  6. </connectionStrings>

你还会注意到配置文件中的其他一些设置,这些是默认的 EF 设置,告诉 Code First 在何处创建数据库。由于我们要映射到现有数据库,因此在应用程序中将忽略这些设置。

派生上下文Derived Context

已将 “bloggingcontext” 类添加到项目。 上下文表示与数据库的会话,从而使我们能够查询并保存数据。 上下文公开模型中每个类型的DbSet 。 你还会注意到,默认构造函数使用名称 = 语法调用基构造函数。 这会告知 Code First 应从配置文件加载要用于此上下文的连接字符串。

  1. public partial class BloggingContext : DbContext
  2. {
  3. public BloggingContext()
  4. : base("name=BloggingContext")
  5. {
  6. }
  7. public virtual DbSet<Blog> Blogs { get; set; }
  8. public virtual DbSet<Post> Posts { get; set; }
  9. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  10. {
  11. }
  12. }

使用配置文件中的连接字符串时,应始终使用\*name =\ 语法。这可以确保在连接字符串不存在时,实体框架将引发,而不是按约定创建新数据库。*

模型类Model classes

最后,还将博客Post类添加到了项目中。 这些是构成模型的域类。 你将看到应用于类的数据批注,用于指定 Code First 约定不与现有数据库的结构一致的配置。 例如,你将在Blog.NameBlog上看到StringLength批注,因为它们在数据库中的最大长度为200 (Code First 默认值是使用 SQL Server)中的数据库提供程序( nvarchar (max)) 支持的多长度。

  1. public partial class Blog
  2. {
  3. public Blog()
  4. {
  5. Posts = new HashSet<Post>();
  6. }
  7. public int BlogId { get; set; }
  8. [StringLength(200)]
  9. public string Name { get; set; }
  10. [StringLength(200)]
  11. public string Url { get; set; }
  12. public virtual ICollection<Post> Posts { get; set; }
  13. }

4. 读取 & 写入数据4. Reading & Writing Data

现在,我们有了一个模型,可以使用它来访问某些数据了。 在Program.cs中实现Main方法,如下所示。 此代码创建一个新的上下文实例,然后使用它来插入新的博客。 然后,它使用 LINQ 查询从按标题字母顺序排序的数据库中检索所有博客

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. using (var db = new BloggingContext())
  6. {
  7. // Create and save a new Blog
  8. Console.Write("Enter a name for a new Blog: ");
  9. var name = Console.ReadLine();
  10. var blog = new Blog { Name = name };
  11. db.Blogs.Add(blog);
  12. db.SaveChanges();
  13. // Display all Blogs from the database
  14. var query = from b in db.Blogs
  15. orderby b.Name
  16. select b;
  17. Console.WriteLine("All blogs in the database:");
  18. foreach (var item in query)
  19. {
  20. Console.WriteLine(item.Name);
  21. }
  22. Console.WriteLine("Press any key to exit...");
  23. Console.ReadKey();
  24. }
  25. }
  26. }

现在可以运行应用程序并对其进行测试。

  1. Enter a name for a new Blog: ADO.NET Blog
  2. All blogs in the database:
  3. .NET Framework Blog
  4. ADO.NET Blog
  5. The Visual Studio Blog
  6. Press any key to exit...

如果数据库发生了更改,该怎么办?What if My Database Changes?

“Code First 到数据库” 向导旨在生成一组可以进行调整和修改的起始点。 如果数据库架构发生更改,则可以手动编辑类,也可以执行其他反向工程来覆盖类。

使用现有数据库的 Code First 迁移Using Code First Migrations to an Existing Database

如果要对现有数据库使用 Code First 迁移,请参阅Code First 迁移到现有数据库

摘要Summary

在本演练中,我们使用现有数据库查看 Code First 开发。 我们使用了 Visual Studio Entity Framework Tools 来反向工程映射到数据库并可用于存储和检索数据的一组类。