DBContext会覆盖以前的迁移

时间:2015-05-15 21:46:45

标签: c# entity-framework asp.net-mvc-5

我目前有两个DbContexts,ApplicationDbContext和CompanyDBContext。但问题是,当我运行我的MVC Web应用程序时,只有CompanyDBContext会反映在数据库上,而且我看不到ApplicationDbContext中的任何实现都显示在数据库中。我的两个上下文都使用相同的连接字符串。我创建MVC应用程序时自动生成ApplicationDbContext,因为我选择了个人帐户

目前ApplicationDbContext看起来像这样

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
 {
    public ApplicationDbContext()
        : base("DevConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Ignore<CompanyDetails>();
    }
}

这是我的CompanyDbContext

public class CompanyDBContext : DbContext
{

    public CompanyDBContext() : base("DevConnection")
    {
    }

    public DbSet<CompanyDetails> companies { get; set; }

}

4 个答案:

答案 0 :(得分:2)

如果您不需要它们,我会删除您现在的迁移,然后使用下面的命令通过指定它们的名称和目录来单独启用它们,因此它们是单独创建的。

enable-migrations -ContextTypeName MyCoolContext -MigrationsDirectory MyCoolMigrations

http://www.mortenanderson.net/code-first-migrations-for-entity-framework

答案 1 :(得分:1)

似乎只有一个dbContext可以立即更新。每个dbContext都必须Enable-MigrationAdd-MigrationUpdate-Database。这就是我这样做的方式。但是我的dbContext处于不同的项目中,所以可能对你来说也是一样的!单独更新并没有覆盖我的数据库。它对我有用!

答案 2 :(得分:1)

我很好奇,所以我环顾四周,似乎迁移和多个DbContext的解决方案是使用单个DbContext作为数据库的完整表示,通过该数据库进行初始化处理迁移,并在所有其他DbContext类的构造函数中禁用数据库初始化。

您可以通过Database.SetInitializer和明确调用DbContext.Database.Initialize()

的组合来完成此操作

<强>来源

答案 3 :(得分:0)

在思考您遇到的问题时,您的数据库表/迁移不会分开。

在EF6中,如果您使用多个上下文,我建议您在OnModelCreating派生类的DbContext方法中指定默认架构的名称(Fluent-API配置所在的位置)

public partial class ApplicationDbContext : DbContext
{   
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("Application");

        // Fluent API configuration
    }   
}

public partial class CompanyDBContext : DbContext
{   
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("Company");

        // Fluent API configuration
    }   
}   

此示例将使用&#34; Application&#34;和&#34;公司&#34;作为您的(单个)数据库中数据库表(而不是&#34; dbo&#34;)的前缀。 更重要的是,它还会在__MigrationHistory表格前加上前缀,例如Application.__MigrationHistoryCompany.__MigrationHistory。 因此,您可以在一个数据库中拥有多个__MigrationHistory表,每个上下文一个。 因此,您为一个上下文所做的更改不会与另一个上下文混淆。

添加迁移时,请在DbMigrationsConfiguration命令中将参数类的完全限定名称(源自add-migration)指定为参数:

add-migration NAME_OF_MIGRATION -ConfigurationTypeName FULLY_QUALIFIED_NAME_OF_CONFIGURATION_CLASS

e.g。

add-migration NAME_OF_MIGRATION -ConfigurationTypeName ApplicationConfiguration

如果ApplicationConfiguration是配置类的名称。


在这种情况下,您可能还希望使用不同的&#34;迁移&#34;你项目中的文件夹。您可以使用DbMigrationsConfiguration属性相应地设置MigrationsDirectory派生类:

internal sealed class ApplicationConfiguration: DbMigrationsConfiguration<ApplicationDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        MigrationsDirectory = @"Migrations\Application";
    }
}

internal sealed class CompanyConfiguration : DbMigrationsConfiguration<CompanyDBContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        MigrationsDirectory = @"Migrations\Company";
    }
}