1
我有一个EF代码第一个模型,其中包含Foo表和Bar表。这是一个多对多的关系,因此EF生成一个名为FooBars的联结表:EF代码第一迁移坚持要切换联结表名
CreateTable(
"dbo.FooBar",
c => new
{
Foo_Id = c.Int(nullable: false),
Bar_Id = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Foo_Id, t.Bar_Id })
.ForeignKey("dbo.Foos", t => t.Foo_Id, cascadeDelete: true)
.ForeignKey("dbo.Bars", t => t.Bar_Id, cascadeDelete: true)
.Index(t => t.Foo_Id)
.Index(t => t.Bar_Id);
一切都好。现在,我对模型进行了一些更改并添加了迁移。 Foo实体现在具有一些额外的字符串和整型属性,关系或任何内容都没有变化。然而,出于某种原因,EF现在坚持认为,结合表应该叫BarFoos,并希望删除原来的FooBars表:
DropForeignKey("dbo.FooBars", "Foo_Id", "dbo.Foos");
DropForeignKey("dbo.FooBars", "Bar_Id", "dbo.Bars");
DropIndex("dbo.Foobars", new[] { "Foo_Id" });
DropIndex("dbo.FooBars", new[] { "Bar_Id" });
CreateTable(
"dbo.BarFoos",
c => new
{
Bar_Id = c.Int(nullable: false),
Foo_Id = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Bar_Id, t.Foo_Id })
.ForeignKey("dbo.Bars", t => t.Bar_Id, cascadeDelete: true)
.ForeignKey("dbo.Foos", t => t.Foo_Id, cascadeDelete: true)
.Index(t => t.Bar_Id)
.Index(t => t.Foo_Id);
DropTable("dbo.FooBars");
很显然,我可能只是所有记录FooBars到BarFoos复制,但这是烦人地狱,以及我需要继续做的事情,因为我对模型进行了更改并重新生成了此特定的迁移。为什么外汇基金坚持认为交汇处应该突然变成另一种方式?我可以做些什么来避免这种情况?
我有过这种以前发生的 - 我从来没有找到一个解决办法,但我的解决方法是强制流利的表名API。例如 modelBuilder.Entity(Of User)()_ .HasMany(Function(u)u.Roles)_WithMany(Function(r)r.Users)_ .Map(Function(u)u.MapRightKey “User_UserID”)。MapLeftKey(“Role_RoleID”).ToTable(“UserRoles”)) – Carl
我不得不从你给的例子中翻转左右键,但之后它工作:迁移不再试图改变任何东西关于它: modelBuilder.Entity().HasMany(s => s.Bars).WithMany(t => t.Foos).Map(m => m.MapRightKey(“Bar_Id”)。MapLeftKey(“Foo_Id “).ToTable(” FooBars“)); 奇怪的是,它发生和烦人,我们需要这样的解决方法,但仍然,它的工作原理,它比有史以来我们重新生成编辑生成的代码更好。 感谢您的帮助,Carl! –
Bas
@Carl你可以把你的评论作为答案。这将是很好,让它格式正确。另外我可以投你一票 – Colin