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

Ric*_*ddy 58 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>
Run Code Online (Sandbox Code Playgroud)

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

Update-Database -StartUpProjectName "TestDB.Data"
Run Code Online (Sandbox Code Playgroud)

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

TestDB.Data.DataContext
Run Code Online (Sandbox Code Playgroud)

有没有办法确保传递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();
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢,

丰富

Sco*_*ord 78

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

Update-Database -Verbose 
 -ConnectionString "CONNECTIONSTRING" 
 -ConnectionProviderName "System.Data.SqlClient"
 -StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT
Run Code Online (Sandbox Code Playgroud)

如果你喜欢无休止地打字,那就很容易.

  • 如果您尝试从 Web.config 中提取连接字符串,则应使用 `-ConnectionStringName "DefaultConnection"` (2认同)

And*_*bel 33

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

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

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


Mik*_*ond 23

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

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

  • 两年后的+1,因为上面的粗体部分正是我疯狂的24小时搜索之后所需要的! (3认同)

Cal*_*aNN 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在程序包管理器控制台中查看帮助页面.

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

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

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