使用实体框架迁移4.3时如何显式命名数据库

我最近开始使用实体框架迁移,并注意到当我运行 Update-Database命令时,数据库名称对我来说不起作用。

我的连接字符串是:

<connectionStrings>
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>

我第一次运行 更新-资料库的时候,我的数据库是用正确的名字 TestDB创建的。然而,只要我对我的实体之一进行更改,它将不再为我更新,除非我添加一个启动项目名称(我正在使用一个多项目解决方案) :

Update-Database -StartUpProjectName "TestDB.Data"

这使得另一个新的数据库,迁移将始终继续使用。我不介意必须输入 StartUpProjectName命令,但是有没有办法覆盖这个生成的数据库的默认名称?它始终将数据库创建为

TestDB.Data.DataContext

是否有方法确保在传递 StartUpProject 名称时创建的数据库仅被称为 TestDB,或者这是使用 StartUpProjectName 设置的限制?

注意,我认为需要指定 StartUpProjectName 的原因是我有一个多层项目设置。迁移配置文件在我的“数据”项目中,实体/模型在我的“域”项目中,等等。我目前在 Global.asax.cs 文件中也没有任何初始化选项,因为我以前在代码 first ef 4.2中使用过这些选项。因此,在我的项目中,我只有一个 DataContext 在我的数据项目中,迁移配置也在该项目中。

编辑:

由于我最初设置了这个问题,我偶然发现了在多项目解决方案中命名数据库的“正确”方法。虽然下面的答案将工作,但这意味着您正在复制您的 web.config 在另一个领域,这不是一个理想的解决方案。相反,您可以通过以下方法将名称放入 DbContext 中(DataContext 是我在项目中使用的名称) :

public class DataContext : DbContext
{
public DataContext() : base("DatabaseNameHere")
{ }


public DbSet<Table1> Table1 { get; set; }
public DbSet<Table2> Table2 { get; set; }


public virtual void Commit()
{
base.SaveChanges();
}
}

谢谢,

瑞奇

58778 次浏览

在执行 update-database时,应该指定包含迁移的项目。确保在该项目中有一个包含正确连接字符串的 app.config文件。

当将一个应用程序分割成几个项目时,运行该应用程序时使用的连接字符串是已启动的项目之一。迁移时,所使用的连接字符串是包含迁移的项目之一。

当我进行类似的设置时,我必须在两个地方添加连接字符串。有点尴尬,但是很有效。

您可以通过提供它作为参数来避免在 app.config 中管理它:

Update-Database -Verbose
-ConnectionString "CONNECTIONSTRING"
-ConnectionProviderName "System.Data.SqlClient"
-StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT

如果你喜欢不停地打字的话,那就简单多了。

我试用了 Nuget 最新的 EF5。

然而,Update-Database并不从包含迁移的项目中读取 App.config(就像1年前的答案一样) ,而是仅从 启动项目中读取 *.config。这很棒,但是我在这里发现了 Add-MigrationUpdate-Database如何找到合适的连接字符串:

  1. 它首先尝试获取“ DefaultConnection”连接字符串
  2. 然后尝试根据上下文类名获取连接字符串名称。例如,我有从 DbContext派生的 MyContext类,所以我可以使用“ MyContext”连接字符串名称。当我有多个 db 连接时非常有用。
  3. 如果找不到上述两个连接字符串名称,那么它将失败,并且不会显示“ DefaultConnection”连接字符串,除非您提供 -ConnectionStringName参数。请参阅 get-help Update-Database以查看 PackageManager 控制台中的帮助页面。

没有重试或回退尝试,所以如果“ DefaultConnection”包含一个错误的连接字符串,它只会显示一个错误。

如果连接字符串中同时存在 DefaultConnection 和上下文名称,则 DefaultConnection 将优先。

我希望 # 2成为第一次尝试,因为名称更具体,但以上步骤是 EF5迁移时,尝试连接到数据库。

您可以将连接字符串存储在网站项目中的 web.config 中,将 DBContext 和迁移文件存储在另一个项目中,并且仍然共享相同的连接字符串。然而,您需要确保除了设置 Data 项目(或者其中包含 DBContext 等的任何项目)作为 Package Manager Console 的默认项目之外,您还需要设置 还需要确保您的网站设置为默认启动项目! ! !

我在任何地方都找不到这方面的文档,但是经过24小时的疯狂思考,我无法理解为什么突然将我的迁移应用到 SQLExpress 数据库,这让我得出了这个结论。