繁体   English   中英

DBContext覆盖以前的迁移

[英]DBContext overwrites previous migration

我目前有两个DbContext,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; }

}

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

enable-migrations -ContextTypeName MyCoolContext -MigrationsDirectory MyCoolMigrations

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

似乎一次只能更新一个dbContext。 您必须为每个dbContext Enable-MigrationAdd-MigrationUpdate-Database 这就是我做到的方式。 但是我的dbContext位于不同的项目中,所以可能对您来说可以一样! 单独进行更新并不会覆盖我的数据库。 这个对我有用 !

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

您可以通过结合Database.SetInitializer和对DbContext.Database.Initialize()的显式调用来DbContext.Database.Initialize()

来源

考虑到您遇到的问题是数据库表/迁移没有分开。

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

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
    }   
}   

本示例将使用“应用程序”和“公司”作为您(单个)数据库中数据库表(而不是“ dbo”)的前缀。 更重要的是,它还将在__MigrationHistory表之前__MigrationHistory前缀,例如Application.__MigrationHistoryCompany.__MigrationHistory 因此,在一个数据库中可以有多个__MigrationHistory表,每个表一个。 因此,您对一个上下文所做的更改不会与另一个上下文混淆。

添加迁移时,请在add-migration命令中指定配置类的全限定名称(从DbMigrationsConfiguration派生)作为参数:

add-migration NAME_OF_MIGRATION -ConfigurationTypeName FULLY_QUALIFIED_NAME_OF_CONFIGURATION_CLASS

例如

add-migration NAME_OF_MIGRATION -ConfigurationTypeName ApplicationConfiguration

如果ApplicationConfiguration是配置类的名称。


在这种情况下,您可能还希望使用项目中的其他“迁移”文件夹。 您可以使用MigrationsDirectory属性相应地设置DbMigrationsConfiguration派生类:

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";
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM