我最近开始使用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();
}
}
谢谢,
富
答案 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)
但是Update-Database
不会从包含迁移的项目中读取App.config
(就像1年前的答案一样),但它只会从启动时读取*.config
项目即可。这很棒,但我发现Add-Migration
和Update-Database
如何找到合适的连接字符串:
MyContext
派生的DbContext
类,所以我可以使用“MyContext”连接字符串名称。当我有多个数据库连接时很有用。-ConnectionStringName
参数,否则它将失败并且不显示“DefaultConnection”连接字符串。请参阅get-help Update-Database
以查看软件包管理器控制台中的帮助页面。没有重试或回退尝试,因此如果“DefaultConnection”包含错误的连接字符串,则只会显示错误。
如果连接字符串中存在DefaultConnection和上下文名称,则DefaultConnection优先。
我更希望#2成为第一次尝试,因为名称更具体,但上述步骤是EF5迁移在尝试连接数据库时所执行的操作。