EF核心代码优先创建数据库,但无处可寻

时间:2019-12-09 15:35:11

标签: c# sql-server entity-framework asp.net-core

我正在开发ASP.NET Core应用程序,并决定通过代码优先的迁移方式引入EF Core。我创建了一个DbContext类,并将其注册在Startup类中。对于连接字符串,我已经在VS2019中打开了SQL Server Object Explorer,右键单击(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命令运行良好,没有错误,但是我无法从生成的SQL中找到任何CREATE DATABASE语句。现在,从技术上来说,我有一个数据库,但是在SQL Server Object Explorer或SQL Server Management Studio中都看不到它。

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

  

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

将数据库名称更改为QuizNet1后,确实像"server=(localdb)\\mssqllocaldb; database=QuizNet1;Trusted_Connection=True;MultipleActiveResultSets=true"一样创建了一个数据库,我可以在SQL Server Object Explorer中看到它。

因此,我的第一次尝试确实似乎弄乱了连接字符串,并且EF Core创建了一个数据库,但是我在任何地方都找不到它。

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

1 个答案:

答案 0 :(得分:0)

EF Core(包含在ASP.NET Core项目中)将使用Startup进行自我引导。如果通过类库将其包含(例如,不能直接运行的内容),则必须创建一个IDesignTimeDbContextFactory实现来定义连接字符串,或者在上下文中重写OnConfiguring来定义那里的连接字符串。在后两种情况下,连接字符串仅用于开发目的。两种方法都不应该用于生产工作流程。