.NET Core 下的 EF Core 新数据库入门指南

在这个演练中,你将构建一个针对 SQLite 数据库执行基础数据问的 .NET Core 控制台应用程序。你将使用迁移来从模型创建数据库。查看 ASP.NET Core - 新数据库 可了解相应的 Visual Studio 版本,其中使用的是 ASP.NET Core MVC。

注意

.NET Core SDK 已不再支持 project.json 或 Visual Studio 2015。我们建议你 将 project.json 迁移到 csproj。如果你正在使用 Visual Studio,我们建议你迁移到 Visual Studio 2017

提示

你可以在 GitHub 上查阅当前文章涉及的代码样例

先决条件

以下是完成当前演练所需的先决条件:

  • 支持 .NET Core 的操作系统
  • .NET Core SDK 2.0 (尽管通过少量修改就可以通过入门简介了解如何使用之前的版本创建应用程序)。

创建新项目

  • 为你的项目新建一个 ConsoleApp.SQLite 目录,然后使用 dotnet 命令将 .NET Core 应用程序填充进去。
  1. mkdir ConsoleApp.SQLite
  2. cd ConsoleApp.SQLite/
  3. dotnet new console

安装 Entity Framework Core

要使用 EF Core 的话,就要根据你的目标数据库提供程序安装相应的程序包。当前演练使用的是 SQLite。查看 数据库提供程序 可获得可用提供程序的列表。

  • 安装 Microsoft.EntityFrameworkCore.Sqlite 和 Microsoft.EntityFrameworkCore.Design
  1. dotnet add package Microsoft.EntityFrameworkCore.Sqlite
  2. dotnet add package Microsoft.EntityFrameworkCore.Design
  • 手动编辑 ConsoleApp.SQLite.csproj,添加 DotNetCliToolReference 以将Microsoft.EntityFrameworkCore.Tools.DotNet 包含到项目中:
  1. <ItemGroup>
  2. <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  3. </ItemGroup>

注意

未来版本的 dotnet 将能够通过 dotnet add tool 来添加 DotNetCliToolReference。

现在的 ConsoleApp.SQLite.csproj 看起来应该是这样的:

  1. <Project Sdk="Microsoft.NET.Sdk">
  2. <PropertyGroup>
  3. <OutputType>Exe</OutputType>
  4. <TargetFramework>netcoreapp2.0</TargetFramework>
  5. </PropertyGroup>
  6. <ItemGroup>
  7. <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  8. </ItemGroup>
  9. <ItemGroup>
  10. <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.0.0" />
  11. </ItemGroup>
  12. </Project>

注意

上面使用的版本号会在发布时已经修正。

  • 运行 dotnet restore 以安装新的程序包

创建模型

现在,是时候定义构成你的模型的上下文和实体类型了。

  • 创建新的 Model.cs 文件并用以下代码填充它。
  1. using Microsoft.EntityFrameworkCore;
  2. using System.Collections.Generic;
  3. namespace ConsoleApp.SQLite
  4. {
  5. public class BloggingContext : DbContext
  6. {
  7. public DbSet<Blog> Blogs { get; set; }
  8. public DbSet<Post> Posts { get; set; }
  9. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  10. {
  11. optionsBuilder.UseSqlite("Data Source=blogging.db");
  12. }
  13. }
  14. public class Blog
  15. {
  16. public int BlogId { get; set; }
  17. public string Url { get; set; }
  18. public List<Post> Posts { get; set; }
  19. }
  20. public class Post
  21. {
  22. public int PostId { get; set; }
  23. public string Title { get; set; }
  24. public string Content { get; set; }
  25. public int BlogId { get; set; }
  26. public Blog Blog { get; set; }
  27. }
  28. }

提示

在真实的应用程序里面你会将每个类型放到独立的文件中,并且将链接字符串放到配置文件中。为了简单起见,我们将当前课程中的所有代码都放到单一的文件中。

创建数据库

你已经有一个模型了,你可以使用迁移来创建数据库。

  • 运行 dotnet ef migrations add InitialCreate 以搭建迁移基架和创建模型对应的初始表集合。
  • 运行 dotnet ef database update 以将新的迁移应用到数据库。该命令会在应用迁移之前创建数据库。

注意

当使用了 SQLite 相对路径时,路径是相对于应用程序主程序集的。在当前样例中,主二进制文件是 bin/Debug/netcoreapp2.0/ConsoleApp.SQLite.dll,所以 SQLite 数据库将在 bin/Debug/netcoreapp2.0/blogging.db 目录下。

使用模型

现在,你可以使用模型进行数据访问了

  • 打开 Program.cs
  • 使用以下代码替换类文件中的内容:
  1. using System;
  2. namespace ConsoleApp.SQLite
  3. {
  4. public class Program
  5. {
  6. public static void Main()
  7. {
  8. using (var db = new BloggingContext())
  9. {
  10. db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
  11. var count = db.SaveChanges();
  12. Console.WriteLine("{0} records saved to database", count);
  13. Console.WriteLine();
  14. Console.WriteLine("All blogs in database:");
  15. foreach (var blog in db.Blogs)
  16. {
  17. Console.WriteLine(" - {0}", blog.Url);
  18. }
  19. }
  20. }
  21. }
  22. }
  • 测试应用程序:

dotnet run

一个博客已经保存到了数据库,然后所有的 blog 详细信息都被打印到了 控制台。

  1. ConsoleApp.SQLite>dotnet run
  2. 1 records saved to database
  3. All blogs in database:
  4. - http://blogs.msdn.com/adonet

更改模型

  • 如果你更改了模型,可以使用 dotnet ef migrations add 命令搭建新的基架来确保相应的模式能变更到数据库。一旦你签出了基架代码(并根据需要做了任何变更),可以使用 dotnet ef database update 命令将变更应用到数据库。
  • EF 在数据库中使用 __EfMigrationHistory 表来记录哪些迁移已经被应用到数据库。
  • 由于SQLite 本身的限制,SQLite 并不支持所有的迁移(模式变更)。对于全新的开发,建议在你的模型变更时删除数据库并创建新库,而不是使用迁移。

其他资源