如何在使用Entity Framework Migrations 4.3时显式命名数据库

时间:2012-02-17 11:27:50

标签: entity-framework ef-migrations

我最近开始使用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。所以在我的项目中,我只在Data项目中有一个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 个答案:

答案 0 :(得分:74)

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

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

如果你喜欢无休止地打字,那就太容易了。

答案 1 :(得分:31)

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

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

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

答案 2 :(得分:23)

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

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

答案 3 :(得分:9)

我尝试使用Nuget的最新EF5。

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

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

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

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