2011-05-18 81 views
1

我有以下對象實體模型:更新具有多對多關係的實體框架4模型,如何?

  • 任務
  • 任務類型

我有以下關係: 家< 1> ---- < >任務(一對多) 任務<> ---- < 1>任務類型(多對一)

現在,我想在House和TaskType之間添加多對多的關係,以設置哪些TaskType可用於房屋。

什麼是正確的方式在Visual Studio 2010中執行此操作,而不會丟失數據庫中的數據。

如果我在沒有生成任何數據庫的全新模型上執行此操作,它可以正常工作,但如果在第一次生成數據庫後嘗試添加它,我將全部鬆開我的數據,因爲生成SQL會刪除所有表。

如果我嘗試在名爲HouseTaskTypes的數據庫中手動創建一個包含兩列(House_Id和TaskType_Id)的表,並將外鍵指向House和TaskTypes,那麼當我從數據庫更新模型時,它看起來很奇怪。

我大概可以通過一些手動調整來實現它,但我想知道在現有的實體框架模型中添加多對多關聯/關係的正確方法。

所有的想法都讚賞!

回答

1

EF 4.1不支持將現有數據庫模式遷移到新數據庫模式。來自msdn

Code First不支持現有數據庫模式的遷移 。 實體框架4.1確實支持 刪除並重新創建數據庫 架構當模型更改通過 使用數據庫初始值設定項時。該 以下初始化的支持: CreateDatabaseIfNotExist, DropCreateDatabaseAlways和 DropCreateDatabaseIfModelChanges

所以,解決你的問題,我會

  • 設置初始化程序,以CreateDatabaseIfNotExist,或將其關閉
  • 手動表添加到數據庫
  • 的導航屬性手動添加到您的模型
  • 手動映射許多一對多關係(見下文)
  • 則任何數據添加到新的表或者通過應用程式或手動

要手動映射關係添加下面的方法來你的DbContext

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

    modelBuilder.Configurations.Add(new HouseConfiguration()); ` 
} 

然後,在相同或訪問,命名空間你的DbContext類,添加配置類的許多一對多關係的一側。這個類的目的是做實際的映射。我通常爲這些配置類有一個單獨的名稱空間。

class HouseConfiguration : EntityTypeConfiguration<House> 
{ 
    public HouseConfiguration() 
    { 
     // many-to-many w/tasktypes 
     this.HasMany(h => h.TaskTypes) 
      .WithMany(tt => tt.Houses) 
      .Map(m => 
       { 
        m.ToTable("HouseTaskTypes"); 
        m.MapLeftKey("HouseId"); 
        m.MapRightKey("TaskTypeId"); 
       }); 

    } 
} 

您將不得不仔細檢查屬性名稱/鍵名稱,但這應該這樣做。

+0

這就是我一直在嘗試做的事情。我首先在兩個欄目中添加了一個「中間」表格,其中一個用於House_id,另一個用於TaskType_id。這是在SQL Server(2008 R2 Express)中完成的。 然後,我嘗試在Visual Studio中的實體模型設計器的「House」實體和「TaskType」實體之間添加多對多關聯。問題是我收到錯誤「沒有爲以下的實體集/關聯集指定映射」。 由於該表沒有出現在「模型瀏覽器 - >存儲 - >表/視圖」部分,我無法映射到它。 – Sverker84 2011-05-20 08:25:16

+0

@ Sverker84編輯我的答案 – 2011-05-20 20:09:14

相關問題