context.database.create()抛出异常无效的列名“Branch_Id”

时间:2016-04-08 11:41:26

标签: entity-framework entity-framework-6 ef-migrations

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

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 是一个标识列,我遇到了“一个表没有多个标识列”的问题,而在新的迁移中,我有 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:列名“ Branch_Id ”无效..

我无法直接调试集成测试,因为我从未到达那里,所以问题必须是context.database.create()方法。

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

我不明白那种情况。

请有人帮忙吗: - )

更新

问题: AddedTablesForBranchData和迁移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; }
    }

1 个答案:

答案 0 :(得分:0)

通过注释财产:

public virtual SalesBranch Branch { get; set; } [ForeignKey("BranchId")]它解决了问题!

模型似乎与迁移不同步!