4.3使用entity framework迁移时如何显式命名数据库
我最近开始使用entity framework迁移,并注意到,当我运行Update-Database
命令时,数据库名称没有通过。
我的连接string是:
<connectionStrings> <add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" /> </connectionStrings>
我第一次运行Update-Database时,我的数据库是用正确的名称TestDB创build的。 但是,只要我对其中一个实体进行更改,除非我添加启动项目名称(我正在使用多项目解决scheme),否则不会再更新:
Update-Database -StartUpProjectName "TestDB.Data"
然后这又创build了另一个新的数据库,这个迁移将会一直继续使用。 我不介意不得不放在StartUpProjectName命令,但有没有办法来覆盖这个数据库的默认名称? 它总是创build数据库为
TestDB.Data.DataContext
有没有办法确保在传递StartUpProject名称时创build的数据库只是称为TestDB,或者这是使用StartUpProjectName设置的限制吗?
作为一个说明,我认为我需要指定StartUpProjectName的原因是我有一个多层项目设置。 迁移configuration文件是在我的“数据”项目中,实体/模型在我的“域”项目等我也没有任何初始化我的Global.asax.cs文件中的选项,因为我以前会用先编码4.2。 所以在我的项目中,我只是在我的数据项目中有一个DataContext,在该项目中也有Migrationsconfiguration。
编辑:
由于我最初设置了这个问题,我偶然发现了在多项目解决scheme中命名数据库的“正确”方法。 虽然下面的答案将起作用,但这意味着你正在复制你的web.config在另一个不是理想解决scheme的领域。 相反,你可以通过做这样的事情把名字放到你的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(); } }
谢谢,
丰富
在执行update-database
,应该指定包含迁移的项目。 确保在该项目中有一个包含正确连接string的app.config
文件。
在多个项目上拆分应用程序时,运行应用程序时使用的连接string是启动的项目之一。 在迁移时,使用的连接string是包含迁移的项目之一。
当我做了类似的设置,我不得不在两个地方添加连接string。 有点尴尬,但它的作品。
你可以通过提供一个参数来避免在app.config中pipe理它:
Update-Database -Verbose -ConnectionString "CONNECTIONSTRING" -ConnectionProviderName "System.Data.SqlClient" -StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT
如果你喜欢无休止地打字,那么简单易上手。
您可以将连接string存储在您的网站项目的web.config中,并将DBContext和迁移文件存储在另一个项目中,并仍共享相同的连接string。 但是,您需要确保将Data项目(或其中包含DBContext等的项目)设置为程序包pipe理器控制台的默认项目,您还需要确保将您的网站设置为默认启动项目!
我无法在任何地方看到这个logging,但24小时的疯狂无法弄清楚为什么我的迁移突然被应用到SQLExpress数据库,导致我得出这个结论。
我尝试从Nuget的最新EF5。
然而, Update-Database
不会从包含迁移的项目中读取App.config
(就像1年前的答案一样),但它只会从启动项目中读取*.config
。 这很好,但是我发现Add-Migration
和Update-Database
在这里find一个合适的连接string:
- 它试图首先获得“DefaultConnection”连接string
- 然后它试图根据上下文类名来获取连接string名称。 例如我有从
MyContext
派生的MyContext
类,所以我可以使用“MyContext”连接string名称。 当我有多个数据库连接时很有用。 - 如果没有find上述连接string名称,它将会失败并且不显示“DefaultConnection”连接string,除非您提供
-ConnectionStringName
参数。 请参阅get-help Update-Database
以查看软件包pipe理器控制台中的帮助页面。
没有重试或回退尝试,所以如果“DefaultConnection”包含错误的连接string,它将只显示一个错误。
如果DefaultConnection和上下文名称都存在于连接string中,则DefaultConnection将优先。
我更希望#2成为第一次尝试,因为名称更具体,但上述步骤是EF5迁移时尝试连接到数据库。