MvcMovieContext
对象处理连接到数据库并将 Movie
对象映射到数据库记录的任务。 在 Startup.cs 文件的 ConfigureServices
方法中向依赖关系注入容器注册数据库上下文 :
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddDbContext<MvcMovieContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext"))); }
ASP.NET Core 配置系统会读取 ConnectionString
。 为了进行本地开发,它会从 appsettings.json 文件获取连接字符串:
"ConnectionStrings": { "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true" }
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddDbContext<MvcMovieContext>(options => options.UseSqlite(Configuration.GetConnectionString("MvcMovieContext"))); }
ASP.NET Core 配置系统会读取 ConnectionString
。 为了进行本地开发,它会从 appsettings.json 文件获取连接字符串:
"ConnectionStrings": { "MovieContext": "Data Source=MvcMovie.db" }
当应用部署到测试服务器或生产服务器时,环境变量可用于将连接字符串设置为生产 SQL Server。 有关详细信息,请参阅配置。
LocalDB 是轻型版的 SQL Server Express 数据库引擎,以程序开发为目标。 LocalDB 作为按需启动并在用户模式下运行的轻量级数据库没有复杂的配置。 默认情况下,LocalDB 数据库在 C:/Users/{user} 目录中创建 .mdf 文件 。
从“视图”菜单中,打开“SQL Server 对象资源管理器”(SSOX) 。
右键单击 Movie
表,然后单击“视图设计器”
请注意 ID
旁边的密钥图标。 默认情况下,EF 将名为 ID
的属性设置为主键。
右键单击 Movie
表,然后单击“查看数据”
SQLite 网站上表示:
SQLite 是一个自包含、高可靠性、嵌入式、功能完整、公共域的 SQL 数据库引擎。 SQLite 是世界上使用最多的数据库引擎。
可以下载许多第三方工具来管理并查看 SQLite 数据库。 下面的图片来自 DB Browser for SQLite。 如果你有最喜欢的 SQLite 工具,请发表评论以分享你喜欢的方面。
备注
在本教程中,使用 Entity Framework Core 迁移功能(若可行) 。 迁移会更新数据库架构,使其与数据模型中的更改相匹配。 但是,迁移仅能执行 EF Core 提供程序所支持的更改类型,且 SQLite 提供程序的功能将受限。 例如,支持添加列,但不支持删除或更改列。 如果已创建迁移以删除或更改列,则 ef migrations add
命令将成功,但 ef database update
命令会失败。 由于上述限制,本教程不对 SQLite 架构更改使用迁移。 转而在架构更改时,放弃并重新创建数据库。
要绕开 SQLite 限制,可手动写入迁移代码,在表内容更改时重新生成表。 表重新生成涉及:
有关更多信息,请参见以下资源:
在 Models 文件夹中创建一个名为 SeedData
的新类 。 将生成的代码替换为以下代码:
using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using System; using System.Linq; namespace MvcMovie.Models { public static class SeedData { public static void Initialize(IServiceProvider serviceProvider) { using (var context = new MvcMovieContext( serviceProvider.GetRequiredService< DbContextOptions<MvcMovieContext>>())) { // Look for any movies. if (context.Movie.Any()) { return; // DB has been seeded } context.Movie.AddRange( new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-2-12"), Genre = "Romantic Comedy", Price = 7.99M }, new Movie { Title = "Ghostbusters ", ReleaseDate = DateTime.Parse("1984-3-13"), Genre = "Comedy", Price = 8.99M }, new Movie { Title = "Ghostbusters 2", ReleaseDate = DateTime.Parse("1986-2-23"), Genre = "Comedy", Price = 9.99M }, new Movie { Title = "Rio Bravo", ReleaseDate = DateTime.Parse("1959-4-15"), Genre = "Western", Price = 3.99M } ); context.SaveChanges(); } } } }
如果 DB 中有任何电影,则会返回种子初始值设定项,并且不会添加任何电影。
if (context.Movie.Any()) { return; // DB has been seeded. }
将 Program.cs 的内容替换为以下代码 :
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using MvcMovie.Data; using MvcMovie.Models; using System; namespace MvcMovie { public class Program { public static void Main(string[] args) { var host = CreateHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { SeedData.Initialize(services); } catch (Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred seeding the DB."); } } host.Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } }
测试应用
删除 DB 中的所有记录。 可以使用浏览器中的删除链接,也可从 SSOX 执行此操作。
强制应用初始化(调用 Startup
类中的方法),使种子方法能够正常运行。 若要强制进行初始化,必须先停止 IIS Express,然后再重新启动它。 可以使用以下任一方法来执行此操作:
右键单击通知区域中的 IIS Express 系统任务栏图标,然后点击“退出”或“停止站点”
删除 DB 中的所有记录(使种子方法运行)。 停止并启动应用以设定数据库种子。
应用将显示设定为种子的数据。