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複製,但這是煩人地獄,以及我需要繼續做的事情,因爲我對模型進行了更改並重新生成了此特定的遷移。爲什麼外匯基金堅持認爲交匯處應該突然變成另一種方式?我可以做些什麼來避免這種情況?

+1

我有過這種以前發生的 - 我從來沒有找到一個解決辦法,但我的解決方法是強制流利的表名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

+0

我不得不從你給的例子中翻轉左右鍵,但之後它工作:遷移不再試圖改變任何東西關於它: modelBuilder.Entity ().HasMany(s => s.Bars).WithMany(t => t.Foos).Map(m => m.MapRightKey(「Bar_Id」)。MapLeftKey(「Foo_Id 「).ToTable(」 FooBars「)); 奇怪的是,它發生和煩人,我們需要這樣的解決方法,但仍然,它的工作原理,它比有史以來我們重新生成編輯生成的代碼更好。 感謝您的幫助,Carl! – Bas

+1

@Carl你可以把你的評論作爲答案。這將是很好,讓它格式正確。另外我可以投你一票 – Colin

回答

1

我以前發生過這種情況 - 我從來沒有找到解決方案,但我的解決方法是強制Fluent API中的表名稱。例如:

modelBuilder.Entity(Of User)() _ 
.HasMany(Function(u) u.Roles) _ 
.WithMany(Function(r) r.Users) _ 
.Map(Function(u) u.MapRightKey("Role_RoleID").MapLeftKey("User_UserID").ToTable("UserRoles")) 

(C#,相匹配的問題語言):

modelBuilder.Entity<User>() 
.HasMany(u => u.Roles) 
.WithMany(r => r.Users) 
.Map(u => u.MapRightKey("Role_RoleID").MapLeftKey("User_UserID").ToTable("UserRoles"));