【问题标题】:EF Core code-first creates databse but it's nowhere to be seenEF Core 代码优先创建数据库,但无处可见
【发布时间】:2019-12-09 15:35:11
【问题描述】:

我正在开发一个 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 命令运行良好,没有错误,但是我在生成的 SQL 中找不到任何 CREATE DATABASE 语句。现在我在技术上拥有一个数据库,但我在 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 创建了一个数据库,但我在任何地方都找不到它。

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

【问题讨论】:

  • 检查 Microsoft SQL Server 的安装文件夹“C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA”,您应该会看到 QuizNet 的 .mdf 和 .ldf 文件。删除它们,您的数据库和日志将被删除。

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


【解决方案1】:

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

【讨论】:

  • “这两种方法都不应用于生产工作流程。” - 您的意思是直接在代码中硬编码连接字符串或在类库中包含 EF 并使用您描述的方法之一?
猜你喜欢
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多