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