我在EF 6中遇到了多个上下文的问题。最近我将我的上下文分成了三个部分,并按照被告知here
进行了配置。一切都很好,直到我决定通过Visual Studio发布;因为发布向导只检测到我的上下文之一而不是三个。有趣的是,每当它检测到相同的上下文时,我就无法找到原因,无论是名字的第一个字母还是与其他字母的任何差异,都不会导致这种情况。
但由于这个原因,我无法发布我的MVC项目。我必须在发布时迁移所有三种上下文。
经过一番搜索后,我看到Update-Database命令获取了connectionstring参数。这是我的最后一个选择,如果没有任何解决发布向导的方法,我尝试使用此代码更新数据库。
答案 0 :(得分:2)
我还没有能够重现这个问题。以下是我使用的步骤(使用Visual Studio 2013 Update 2)。
创建一个新的MVC应用程序。将以下模型添加到项目中(两个独立的Code First模型/上下文)。
public class CustomerContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
public class Customer
{
public int CustomerId { get; set; }
public string Name { get; set; }
}
public class ProductContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
然后使用以下命令启用迁移,添加迁移并更新两个上下文的本地数据库。
Enable-Migrations -ContextTypeName CustomerContext -MigrationsDirectory Migrations\Customer
Enable-Migrations -ContextTypeName ProductContext -MigrationsDirectory Migrations\Product
Add-Migration FirstMigration -ConfigurationTypeName MyWebApp.Migrations.Customer.Configuration
Add-Migration FirstMigration -ConfigurationTypeName MyWebApp.Migrations.Product.Configuration
Update-Database -ConfigurationTypeName MyWebApp.Migrations.Customer.Configuration
Update-Database -ConfigurationTypeName MyWebApp.Migrations.Product.Configuration
然后当我右键单击 - &gt;发布项目我可以选择在App_Start上为我的两个上下文(以及ASP.NET标识上下文)启用迁移。如果我理解正确,您在此屏幕中没有看到其他上下文。
答案 1 :(得分:2)
当多个DbContexts共享一个公共连接字符串时,我发现这种情况发生了。我的意思是:
public class Context1: DbContext
{
public Context1()
: this("DefaultConnection")
{}
public Context1: (string connectionString)
: base(connectionString)
{}
....
}
public class Context2: DbContext
{
public Context2()
: this("DefaultConnection")
{}
public Context2: (string connectionString)
: base(connectionString)
{}
...
}
发布时,设置&gt;下只会显示一个DbContext;数据库。如果将“DefaultConnection”更改为其他内容,则会看到不同的DbContexts。像这样:
public class Context1: DbContext
{
public Context1()
: this("DefaultConnection")
{}
public Context1: (string connectionString)
: base(connectionString)
{}
....
}
public class Context2: DbContext
{
public Context2()
: this("DefaultConnection2")
{}
public Context2: (string connectionString)
: base(connectionString)
{}
...
}
也许这可以解释你所看到的行为。
答案 2 :(得分:0)
如果两个dbContexts都使用相同的数据库(因此在web.config中使用相同的数据库连接字符串),我们如何让Web Deploy同时显示它们?我是否必须创建一个指向同一数据库的单独(重复)连接字符串,以使其在向导中显示为单独的上下文?
答案 3 :(得分:0)
如果要在“发布”对话框中查看所有上下文,则需要向web.config添加另一个连接字符串。它们应该具有不同的名称,并从您的上下文(构造函数中的名称)中引用