我有一次添加并成功应用的迁移:
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; }
}
答案 0 :(得分:0)
通过注释财产:
public virtual SalesBranch Branch { get; set; }
[ForeignKey("BranchId")]
它解决了问题!
模型似乎与迁移不同步!