Entity framework context.database.create()引发异常无效列名;分支机构“Id”;

Entity framework context.database.create()引发异常无效列名;分支机构“Id”;,entity-framework,entity-framework-6,entity-framework-migrations,Entity Framework,Entity Framework 6,Entity Framework Migrations,我有一次添加并成功应用的迁移: public partial class AddedTablesForBranchData : DbMigration { public override void Up() { CreateTable( "dbo.SalesArea", c => new {

我有一次添加并成功应用的迁移:

public partial class AddedTablesForBranchData : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.SalesArea",
                c => new
                    {
                        PostalCode = c.Int(nullable: false, identity: true),
                        Location = c.String(),
                        Branch_Id = c.String(maxLength: 128),
                    })
                .PrimaryKey(t => t.PostalCode)
                .ForeignKey("dbo.SalesBranch", t => t.Branch_Id)
                .Index(t => t.Branch_Id);

            CreateTable(
                "dbo.SalesBranch",
                c => new
                    {
                        Id = c.String(nullable: false, maxLength: 128),
                        Name = c.String(),
                        Contacts = c.String(),
                    })
                .PrimaryKey(t => t.Id);

        }

        public override void Down()
        {
            DropForeignKey("dbo.SalesArea", "Branch_Id", "dbo.SalesBranch");
            DropIndex("dbo.SalesArea", new[] { "Branch_Id" });
            DropTable("dbo.SalesBranch");
            DropTable("dbo.SalesArea");
        }
    }
遗憾的是,PostalCode是一个整数。由于本地化,我不得不将其更改为字符串

因此,在一些迁移之后,我添加了一个新的迁移:

 public partial class ReCreateSalesTables : DbMigration
    {
        public override void Up()
        {
            DropForeignKey("SalesArea", "Branch_Id", "SalesBranch");
            DropIndex("SalesArea", new[] { "Branch_Id" });

            DropTable("dbo.SalesArea");
            DropTable("dbo.SalesBranch");

            CreateTable("SalesBranch",
            c => new
            {
                Id = c.String(false, maxLength: 128),
                Name = c.String(),
                Contacts = c.String()
            })
            .PrimaryKey(t => t.Id);

            CreateTable("SalesArea",
            c => new
            {
                Id = c.Int(false, true),
                PostalCode = c.String(maxLength: 32),
                Location = c.String(),
                BranchId = c.String(nullable: false, maxLength: 128)
            })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.SalesBranch", t => t.BranchId)
            .Index(t => t.PostalCode, unique: true);  

        }

        public override void Down()
        {
            throw new Exception("It has never been our intention to use a down migration, else data might be lost...");
        }
    }
然后,由于PostalCode是一个标识列,我遇到了“a table con没有多个标识列”问题,在新的迁移中,我将Id作为一个列标识

因此,我必须在新迁移中删除这两个表,并使用新模式重新创建这些表

我的本地计算机/开发环境似乎没有问题,但当我运行集成测试或在运行任何测试之前,我会执行以下操作:

 [TestClass]
    public sealed class InitializeDatabase
    {
        [AssemblyInitialize]
        public static void AssemblyInit(TestContext x)
        {
            using (var context = new LeadContext())
            {
                // Create database outside of the test transactions else you get a nice exception...
                context.Database.Delete();
                context.Database.Create();
                new Configuration().FillEnums(context);
            }
        }
    }
它删除旧数据库并使用所有迁移创建新数据库。此AssemblyInit方法在调试时运行良好,但在离开该方法几秒钟后,我可以在集成测试中看到此输出:

结果消息:初始化方法IntegrationTests.SalesDataTests.Init引发异常。System.Data.Entity.Core.EntityCommandExecutionException:System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参见内部异常。-->System.Data.SqlClient.SqlException:无效列名“分支Id

我无法直接调试集成测试,因为我从未调试过,所以问题一定是context.database.create()方法

为什么EF抱怨旧的/以前的外键列“Branch_Id”无效

我不理解这种情况

有人能帮忙吗:-)

更新

问题: 在AddedTablesForBranchData和migration ReCreateSalesTables之间发生了什么变化

答复: 我引入了一个属性Id(标识列/字符串),并将属性PostalCode更改为integer/unique:true

更新2

任何SalesX表都不存在流畅的配置

型号

  [Table("SalesBranch")]
    public class SalesBranch
    {
        [Key]
        public string Id { get; set; }
        public string Name { get; set; }
        public string Contacts { get; set; }
        public virtual ICollection<SalesArea>  SalesAreas { get; set; }
    }

 [Table("SalesArea")]
    public class SalesArea
    {
        public int Id { get; set; }

        public string PostalCode { get; set; }

        public string Location { get; set; }

        public virtual SalesBranch Branch { get; set; }

        public int BranchId { get; set; }
    }
[表(“SalesBranch”)]
公营部门
{
[关键]
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共字符串联系人{get;set;}
公共虚拟ICollection销售区域{get;set;}
}
[表(“销售区域”)]
公共类展区
{
公共int Id{get;set;}
公共字符串PostalCode{get;set;}
公共字符串位置{get;set;}
公共虚拟SalesBranch分支{get;set;}
公共整数{get;set;}
}

通过注释属性:

公共虚拟销售分支分支{get;set;}
使用
[ForeignKey(“BranchId”)]
解决了这个问题


模型似乎与迁移不同步

通过注释属性:

公共虚拟销售分支分支{get;set;}
使用
[ForeignKey(“BranchId”)]
解决了这个问题


模型似乎与迁移不同步

你的模型和流畅的代码是什么样子的?@SteveGreene抱歉,我以为我发布了它们!问题已更新,我在两个表上都没有使用任何流畅的配置。这似乎是正确的。EF如何分批完成连续迁移可能有些滑稽。您是否能够删除最后一次迁移(包括AddedTablesForBranchData)?然后向前滚动进行新迁移。您的意思是删除所有迁移之前的迁移,包括已添加的数据迁移吗?那真的有用吗?因为到那时,两个麻烦的迁移仍将执行!如果你认为我错了,请纠正我:-)不,我的意思是迁移和之后。最新的。你的模型和流畅的代码是什么样子的?@SteveGreene抱歉,我以为我发布了它们!问题已更新,我在两个表上都没有使用任何流畅的配置。这似乎是正确的。EF如何分批完成连续迁移可能有些滑稽。您是否能够删除最后一次迁移(包括AddedTablesForBranchData)?然后向前滚动进行新迁移。您的意思是删除所有迁移之前的迁移,包括已添加的数据迁移吗?那真的有用吗?因为到那时,两个麻烦的迁移仍将执行!如果你认为我错了,请纠正我:-)不,我的意思是迁移和之后。最近的。