首页 > 解决方案 > EF Core 代码优先创建数据库,但无处可见

问题描述

我正在开发一个 ASP.NET Core 应用程序,并决定引入具有代码优先迁移的 EF Core。我创建了一个 DbContext 类,并在 Startup 类中注册了它。对于连接字符串,我在 VS2019 中打开了 SQL Server 对象资源管理器,右键单击(localdb)/MSSQLLocalDB并从属性窗口复制粘贴连接字符串,如下所示:

Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=master;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False.

包管理器控制台中的 update-database 命令运行良好,没有错误,但是我无法CREATE DATABASE从生成的 SQL 中找到任何语句。现在我在技术上拥有一个数据库,但我在 SQL Server 对象资源管理器或 SQL Server Management Studio 的任何地方都看不到它。

当我将连接字符串更改为这样的内容时"server=(localdb)\\mssqllocaldb; database=QuizNet;Trusted_Connection=True;MultipleActiveResultSets=true",出现错误:

无法创建文件“C:\Users\ACCOUNT_NAME\QuizNet.mdf”,因为它已经存在。更改文件路径或文件名,然后重试该操作。创建数据库失败。无法创建列出的某些文件名。检查相关错误。

将数据库名称更改为即 QuizNet1 后,"server=(localdb)\\mssqllocaldb; database=QuizNet1;Trusted_Connection=True;MultipleActiveResultSets=true"它确实创建了一个数据库,我可以在 SQL Server 对象资源管理器中看到它。

所以看起来我在第一次尝试时用连接字符串弄乱了一些东西,EF Core 创建了一个数据库,但我在任何地方都找不到它。

另一个小问题 - 调用 update-database 时 EF Core 如何知道连接字符串?连接字符串在 ConfigureServices 方法中设置,据我所知,此方法在运行时调用,而不是在编译时调用。

标签: c#sql-serverentity-frameworkasp.net-core

解决方案


EF Core,当包含在 ASP.NET Core 项目中时,将用于Startup引导自身。如果它是通过类库包含的(即不能直接运行的东西),那么您必须创建一个IDesignTimeDbContextFactory定义连接字符串的实现,或者OnConfiguring在上下文中覆盖以在那里定义连接字符串。在后两种情况下,连接字符串仅用于开发目的。这两种方法都不应用于生产工作流程。


推荐阅读