代码优先更新数据库使用未指定的 localdb 连接字符串

Code first update-database uses localdb connection string which is not specified

Visual Studio 2019,C#

我正在处理我的第一个代码优先实现。

我构建了一个非常有用的数据访问层。然后我去 add/test 进行了数据迁移。

我创建了一个迁移文件,然后转到程序包管理器控制台并运行这个:

更新数据库

长时间停顿后,我看到一条消息:

Target database is: 'OMDB' (DataSource: (localdb)\mssqllocaldb, Provider: System.Data.SqlClient, Origin: Convention).

OMDB 是我的模型。但是,我没有将它指向 app.config 中的 localDB,而是指向 sqlexpress:

….
<connectionStrings>
<add name="OMDB" connectionString="data source=.\SQLEXPRESS;initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
  <parameters>
    <parameter value ="data source=.\SQLEXPRESS;initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"/>
  </parameters>
  </defaultConnectionFactory>
  <providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
   </providers>

…

为了构建数据访问层,我不得不向 class 构造函数添加一个覆盖以加载连接字符串:

    public OMDB(string szConnectionString) : base(szConnectionString)
    { }

但我认为这与我的问题无关...

我将默认项目设置为数据访问层项目 (DAL),我还尝试在更新数据库行上强制设置:

update-database -Verbose -ProjectName DAL

我在我的解决方案中对 localDB 进行了全局搜索,但没有找到结果,所以我不知道它是从哪里得到使用 localdb 作为源的想法...?

关于在何处为该连接提取 localDB 有什么建议吗?

好吧,这个真的让我燃烧了一些时间....我弄清楚了是什么原因造成的,至少现在也是一个解决方法。

我在解决方案中有一个项目是我的数据访问层。即使我在包管理器控制台中选择了该项目,它也会在顶层创建一个空白的应用程序配置。由于 app.config 中没有连接字符串标记,它默认为 localdb 并最终出错。

因此,为了解决这个问题,我将连接字符串从数据访问库项目 app.config 复制到主项目 app.config,一切都开始工作了。不知道它为什么要转到主项目文件,但它是......我稍后会回到这个,但它现在正在工作。

我按照以下步骤设法解决了这个问题。

  1. 将您的网站项目(其中 web.config 包含 connectionStrings)设置为 Visual Studio
  2. 中的 Default/Startup 项目
  3. 确保 connectionString 指向实际的数据库实例
  4. 运行 Enable-MigrationsEnable-Migrations -Force 根据您的需要在程序包管理器控制台中

成功创建 InitialModel 后,您应该会收到如下消息:

Detected database created with a database initializer. Scaffolded migration '202102050903200_InitialCreate' corresponding to existing database. To use an automatic migration instead, delete the Migrations folder and re-run Enable-Migrations specifying the -EnableAutomaticMigrations parameter.