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)
如果你喜欢无休止地打字,那就很容易.
And*_*bel 33
执行此操作时update-database,应指定包含迁移的项目.确保该app.config项目中包含正确连接字符串的文件.
在多个项目中拆分应用程序时,运行应用程序时使用的连接字符串是项目启动之一.迁移时,使用的连接字符串是包含迁移的项目之一.
当我进行类似的设置时,我必须在两个地方添加连接字符串.有点尴尬,但它的工作原理.
Mik*_*ond 23
您可以将连接字符串存储在网站项目中的web.config中,将DBContext和迁移文件存储在另一个项目中,并仍然共享相同的连接字符串.但是,您需要确保将Data项目(或其中包含DBContext等的任何项目)设置为Package Manager控制台的默认项目,您还需要确保将您的网站设置为Default启动项目!!!
我无法在任何地方看到这一点,但是24小时的疯狂无法弄清楚为什么我的迁移突然被应用到SQLExpress数据库,这让我得出了这个结论.
但是Update-Database,不会App.config从包含迁移的项目中读取(就像1年前的答案一样),但它只会*.config从启动项目中读取.这是伟大的,但我发现如何Add-Migration与Update-Database在这里找到一个合适的连接字符串:
MyContext派生的类,DbContext所以我可以使用"MyContext"连接字符串名称.当我有多个数据库连接时很有用.-ConnectionStringName参数,否则它将失败并且不显示"DefaultConnection"连接字符串.请参阅get-help Update-Database在程序包管理器控制台中查看帮助页面.没有重试或回退尝试,因此如果"DefaultConnection"包含错误的连接字符串,它将只显示错误.
如果连接字符串中都存在DefaultConnection和上下文名称,则DefaultConnection优先.
我更喜欢#2成为第一次尝试,因为名称更具体,但上述步骤是EF5迁移在尝试连接数据库时所做的事情.