在同一数据库中使用多个上下文进行

时间:2014-06-02 07:34:27

标签: asp.net-mvc entity-framework visual-studio-2013 entity-framework-6 webdeploy

我在EF 6中遇到了多个上下文的问题。最近我将我的上下文分成了三个部分,并按照被告知here

进行了配置。

一切都很好,直到我决定通过Visual Studio发布;因为发布向导只检测到我的上下文之一而不是三个。有趣的是,每当它检测到相同的上下文时,我就无法找到原因,无论是名字的第一个字母还是与其他字母的任何差异,都不会导致这种情况。

但由于这个原因,我无法发布我的MVC项目。我必须在发布时迁移所有三种上下文。

经过一番搜索后,我看到Update-Database命令获取了connectionstring参数。这是我的最后一个选择,如果没有任何解决发布向导的方法,我尝试使用此代码更新数据库。

4 个答案:

答案 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标识上下文)启用迁移。如果我理解正确,您在此屏幕中没有看到其他上下文。

Screenshot of publish screen

答案 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添加另一个连接字符串。它们应该具有不同的名称,并从您的上下文(构造函数中的名称)中引用