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)?然后向前滚动进行新迁移。您的意思是删除所有迁移之前的迁移,包括已添加的数据迁移吗?那真的有用吗?因为到那时,两个麻烦的迁移仍将执行!如果你认为我错了,请纠正我:-)不,我的意思是迁移和之后。最近的。