我正在开发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方法中设置的,据我所知,此方法是在运行时而不是编译时调用的。
答案 0 :(得分:0)
EF Core(包含在ASP.NET Core项目中)将使用Startup
进行自我引导。如果通过类库将其包含(例如,不能直接运行的内容),则必须创建一个IDesignTimeDbContextFactory
实现来定义连接字符串,或者在上下文中重写OnConfiguring
来定义那里的连接字符串。在后两种情况下,连接字符串仅用于开发目的。两种方法都不应该用于生产工作流程。