2013-04-18 79 views
0

我首先使用EF 5.0代碼,通過PM控制檯使用自動遷移。實體框架代碼與鏈接表的首次遷移問題

我正在嘗試將第4次遷移應用到項目,並且基於約定的連接表的命名導致它們被刪除並以不同的名稱重新創建。這在以前的任何遷移過程中都沒有發生過。

例如:

我有2類用戶和網站。

InitialCreate遷移

這創造了按照慣例被稱爲 「UserSites」 鏈接表。

CreateTable(
      "dbo.UserSites", 
      c => new 
       { 
        User_Id = c.Guid(nullable: false), 
        Site_Id = c.Guid(nullable: false), 
       }) 
      .PrimaryKey(t => new { t.User_Id, t.Site_Id }) 
      .ForeignKey("dbo.Users", t => t.User_Id, cascadeDelete: true) 
      .ForeignKey("dbo.Sites", t => t.Site_Id, cascadeDelete: true) 
      .Index(t => t.User_Id) 
      .Index(t => t.Site_Id); 

一切正常。

跳轉到今天:

第四遷移

這滴UserSites鏈接表,並創建一個SiteUsers鏈接表。

顯然不理想!

public override void Up() 
    { 
     DropForeignKey("dbo.UserSites", "User_Id", "dbo.Users"); 
     DropForeignKey("dbo.UserSites", "Site_Id", "dbo.Sites"); 
     DropIndex("dbo.UserSites", new[] { "User_Id" }); 
     DropIndex("dbo.UserSites", new[] { "Site_Id" }); 


     CreateTable(
      "dbo.SiteUsers", 
      c => new 
       { 
        Site_Id = c.Guid(nullable: false), 
        User_Id = c.Guid(nullable: false), 
       }) 
      .PrimaryKey(t => new { t.Site_Id, t.User_Id }) 
      .ForeignKey("dbo.Sites", t => t.Site_Id, cascadeDelete: true) 
      .ForeignKey("dbo.Users", t => t.User_Id, cascadeDelete: true) 
      .Index(t => t.Site_Id) 
      .Index(t => t.User_Id); 

     DropTable("dbo.UserSites"); 

我無法解釋這一點。

自從第一次實施以來,這兩個類都沒有改變......並且我認爲如果我應用這個,我將遭受數據丟失。

所以這個問題(S):

  1. 我可以只從遷移腳本刪除此代碼,並繼續使用我現有的結構?

  2. 是否有一個我不知道的問題可能導致了這種情況?

任何/所有的援助非常感謝!

編輯:

我只是定義的類如下,並允許按約定建立模型。我已經改變了dbcontext的命名空間,但這就是全部!讓我迷惑不解。

public class User 
{ 
    public virtual ICollection<Site> Sites { get; set; } 
} 

public class Site 
{ 
    public virtual ICollection<User> Users { get; set; } 
} 

回答

0

這是一個奇怪的情況。你有沒有改變你的DbContext?你如何在你的類中聲明SitesUsers屬性?

我想你應該明確添加許多一對多的關係,你的分貝範圍內,像這樣:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<User>() 
       .HasMany<Sites>(u => u.Sites) 
       .WithMany(e => e.Users) 
       .Map(
        m => 
         { 
          m.MapLeftKey("User_Id"); 
          m.MapRightKey("Site_Id"); 
          m.ToTable("UserSites"); 
         }); 

    //for prevent error 'The referential relationship will result in a cyclical reference that is not allowed' 
    modelBuilder.Entity<Sites>() 
       .HasRequired(s => s.User) 
       .WithMany() 
       .WillCascadeOnDelete(false); 
} 

然後刪除您的第4個遷移,並嘗試再次添加它

如果您刪除遷移代碼,您將捕獲導航錯誤,如外鍵問題,表名不正確等。

+0

我編輯了問題以顯示模型定義。我懷疑你是對的,我會更好地明確定義關係。你認爲我可以在這個發展階段將上述內容添加到模型構建器中嗎?猜猜我會試一試! – paterg

+0

好吧,我不明白爲什麼會發生這種情況,但我已經按照您的建議覆蓋了基於多對多的約定(以便複製我最初自動創建的模式),並且這已經得到了Drop-造成我身上的混亂。 – paterg

+0

我很高興它有幫助 –

相關問題