69

我最近开始使用 Entity Framework 迁移,并注意到当我运行Update-Database命令时,数据库名称并没有为我所用。

我的连接字符串是:

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

我第一次运行Update-Database时,我的数据库是用正确的名称TestDB创建的。但是,一旦我对我的一个实体进行了更改,除非我添加启动项目名称(我正在使用多项目解决方案),否则它将不再为我更新:

Update-Database -StartUpProjectName "TestDB.Data"

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

TestDB.Data.DataContext

有没有办法确保在传递 StartUpProject 名称时创建的数据库只是称为TestDB或者这是使用 StartUpProjectName 设置的限制?

作为说明,我认为我需要指定 StartUpProjectName 的原因是我有一个多层项目设置。迁移配置文件在我的“数据”项目中,实体/模型在我的“域”项目中,等等。我的 Global.asax.cs 文件中目前也没有任何初始化选项,就像我之前使用的那样代码优先 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();
    }
}

谢谢,

富有的

4

4 回答 4

96

您可以通过将其作为参数提供来避免在 app.config 中对其进行管理:

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

Easy-piezy,如果你喜欢无休止地打字。

于 2012-05-23T17:06:43.100 回答
33

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

将应用程序拆分为多个项目时,运行应用程序时使用的连接字符串是启动的项目之一。迁移时,使用的连接字符串是包含迁移的项目之一。

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

于 2012-02-25T13:10:42.473 回答
26

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

我无法在任何地方看到这一点,但是疯狂的 24 小时无法弄清楚为什么我的迁移突然被应用于 SQLExpress 数据库,这让我得出了这个结论。

于 2013-12-10T15:39:39.273 回答
10

我尝试使用 Nuget 的最新 EF5。

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

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

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

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

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

于 2013-01-14T07:19:56.067 回答