2012-01-30 160 views
2

我建立使用數據庫第一種方法使用實體框架的DbContext一個ASP.NET MVC的Web應用程序。數據庫,第一種方法和修改數據庫架構

如果在某些條件下,我需要修改數據庫如添加新表或修改現有的表(添加列或改變列的數據類型),應該I:

  1. 刪除現有的實體的.edmx和.tt文件夾並再次重新創建映射
  2. 修改數據庫後手動將修改應用於.tt文件夾下的模型類
  3. 這兩個選項都不是有效的。

我應該如何接近修改我的數據庫架構的任務嗎?

編輯 例如我有添加了* IsManagedBy *輔助methodand的[MetadataType(typeof運算其被自動的.TT文件夾下創建,考慮裸露以下部分類(Books_validation ))]到它: -

[MetadataType(typeof(Books_validation))] 
    public partial class Book 
    { 
     public Book() 
     { 
      this.Assessments = new HashSet<Assessment>(); 
      this.Users_Books = new HashSet<Users_Books>(); 
     } 

     public int BookID { get; set; } 


     public string BookName { get; set; } 
     public string ManagedBy { get; set; } 

     public byte[] Timestamp { get; set; } 

     public virtual ICollection<Assessment> Assessments { get; set; } 
     public virtual User User { get; set; } 
     public virtual ICollection<Users_Books> Users_Bookes { get; set; } 
     public bool IsManagedBy(string userName) 
     { 
      return ManagedBy.Equals(userName, 
      StringComparison.OrdinalIgnoreCase); 
     } 

    } 

然後我創建Book_validation類應用數據的註解如下: -

public class Books_validation 

    { 

     [Required(ErrorMessage = "Name is required")] 
     public string BookName { get; set; } 
     public string ManagedBy { get; set; } 
     [ConcurrencyCheck] 
     [Timestamp] 
     public Byte[] Timestamp { get; set; } 

    } 

這種方法造成三個問題: -

1.的IsManagedBy輔助方法不能在Book_validation類中定義並我應該在自動生成的書部分類,這意味着它將如果被刪除定義它我重新生成代碼!!!

2.如果例如我修改了與Book類有關的評估表(通過外鍵),然後我從.edmx設計器中選擇了「從數據庫更新模型」選項;那麼Visual Studio也會重新生成Book類,這會給我帶來更多麻煩。

3.即使是[MetadataType(typeof運算(Books_validation))]其中i的自動生成的代碼寫到也將在我的情況下重新生成代碼移除,因此這意味着,我必須去在所有修改類併爲它們添加關聯的MetadataType(typeof)。

當我使用ObjectContext模板時,所有這些問題都沒有發生,因爲ObjectContext模板不會自動生成部分類,它只會生成模型類,然後我可以爲它們添加部分類和元類型...所以我認爲最好是返回ObjectContext而不是DBContext !!!,對此有何建議以及上述問題? BR

回答

2

如果您在EDMX右鍵單擊編輯器,應該有一個選項「從數據庫更新模型。」如果您已刪除數據庫中的字段,你可能仍然需要將其刪除,甚至刪除其表,並通過「更新模型從數據庫」菜單中重新添加它,但我覺得這不是刪除整個EDMX和啓動更容易每次新鮮。

更新

由於拉吉斯拉夫說,你永遠不應該亂用自動生成的代碼文件。正如您發現的那樣,這些代碼文件會自動重寫。 Entity Framework的創建者預見到您遇到的問題,並提供了一種機制,您可以在不修改自動生成的.cs文件的情況下添加到這些類中:部分類

部分類允許您創建跨多個文件的類定義,只要它們全部在相同的名稱空間和程序集中。因此除了自動生成的文件Context.cs,您可以創建其他文件是這樣的:

Book.cs

[MetadataType(typeof(Books_validation))] 
public partial class Book 
{ 
    public bool IsManagedBy(string userName) 
    { 
     return ManagedBy.Equals(userName, 
     StringComparison.OrdinalIgnoreCase); 
    } 
} 

部分類的這個單獨定義的存在將導致此代碼在編譯程序集時,可以將其與自動生成的Book類有效「合併」,但它允許您將此特殊自定義代碼放在單獨的文件中,在從EDMX文件重新生成模型數據時不會受到影響。

+0

我試圖從數據庫表中刪除一個字段,然後我使用「從數據庫更新模型」,我選擇了我修改過的表格,但我注意到Visual Studio重新創建了表示修改過的模型類表和通過FK關係連接到這個表的所有類以及我在.tt文件夾下的類內創建的所有數據註釋和幫助器方法都被刪除了...所以我如何避免這兩個問題(影響其他表格和保存數據註釋和輔助方法)。 BR – 2012-01-30 23:17:13

+0

@johnG:我已經讀了幾次你的評論,恐怕我不明白你在說什麼。它如何影響其他表格?你失去了哪些輔助方法?請用一些代碼更新您的問題,以顯示您正在討論的內容的一些示例。 – StriplingWarrior 2012-01-31 00:01:51

+0

感謝StriplingWarrior,我編輯了我的帖子,使其更清晰。 BR – 2012-01-31 03:58:15

0

您不應該修改自動生成的代碼。如果你這樣做了,你無論如何都會破壞整個工作流程,因爲對EDMX文件的任何更改都可以刪除你的更改。所有自定義代碼都屬於您自己的類的一部分(例如,它用於adding validation數據註釋)。

一旦您遵循正確的工作流程,您將能夠修改EDMX並使用從數據庫更新,這是將數據庫更改推送到您的代碼的唯一正確方法。

+0

但在我使用的DbContext模板的情況下,會的DbContext自動生成.tt文件夾中的部分類,所以我將無法爲模型對象定義新的部分類,因爲Visual Studio會引發該類已存在的錯誤!!! BR – 2012-01-31 15:24:41

相關問題