2011-07-20 79 views
6

我使用MVC3 VS2010與EF4.1,我一直在使用SQL Server創建我的數據庫,我將其導入到MVC3 Web應用程序。更新型號從數據庫(數據庫優先)

當我從數據庫中更新模型時,我遇到了一些挑戰我丟失了所有模型文件修改,例如,如果我在某些模型中使用屬性進行驗證或者所有被新模型覆蓋屬性。

是否有從數據庫更新模型而不會丟失模型的信息?

OR

我應該在哪裏對我的模型定義的驗證,而不是直接使用模型的文件?

回答

10

更新:由於這還是比較受歡迎的,我創建這個博客帖子。

http://jnye.co/Posts/19/adding-validation-to-models-created-by-entity-framework-database-first-c

如果你想驗證的模型,而不是使用的ViewModels,使用部分類來定義驗證屬性。例如:

假設你有一個像

public class User { 
    public string Name { get; set; } 
} 

如果你想穿上它一個字符串長度的驗證,你需要創建一個分部類和利用MetadataTypeAttribute(這個住在System.ComponentModel模型.DataAnnotations)

下面的類應該在自己單獨的文件中定義,不要將放在與自動生成的模型相同的文件中。

[MetadataTypeAttribute(typeof(UserMetadata))] 
public partial class User { 
} 

然後你在UserMetadata類中定義的驗證如下

public class UserMetadata{ 
    [StringLength(50)] 
    public string Name {get; set;} 
} 

編輯

我剛剛發現這個物品,其解釋更詳細一點的解決方案 http://themonitoringguy.com/tips-tricks/validating-microsoft-entity-framework-objects-c-mvc/

+0

所以每次模型再生我必須回去爲每個文件並重新定義我的[MetadataTypeAttribute(typeof運算()]屬性。謝謝@NinjaNye但這是不實際的,我的時間。 – Shadi

+0

不,你只會需要定義一個新屬性的驗證,你必須做任何事情,局部類和元數據類不會被覆蓋或替換 – NinjaNye

+0

對不起,我應該更清楚一點,在單獨的一個單獨的類中定義你的部分類和元數據類文件,而不是在自動生成的文件中。我將更新我的答案 – NinjaNye

1

任何設計師的第一條規則是:它會生成無法修改它,因爲它會被徹底刪除您下次更新在設計任何事情的任何代碼。

所有生成的類部分,所以你可以創建自己的一部分的區域,並把您的定製邏輯存在。您顯然不能將屬性添加到在自動生成的零件中定義的屬性。在數據註釋的情況下,可以通過buddy classes或定製的T4模板來實現,該模板將包含您自己的邏輯,以決定在代碼生成期間應添加哪些數據註釋。這兩種情況通常都被認爲是不好的做法,因爲您應該爲每個視圖分別創建視圖模型,並且需要對該視圖進行驗證。

2

不,這些文件每次都會重新生成。

所有類被定義爲局部,因此您可以輕鬆地添加使用MetadataTypeAttribute DataAnnotations。

比方說,你必須定義如下一個User類:

public partial class User { 
    public string Name {get;set;} 
} 

創建IUser接口

public interface IUser { 
    [Required] 
    [DisplayName("User name")] 
    string Name {get;set;} 
} 

然後再擴展User類指定IUser將作爲元數據。

[MetadataType(typeof(IUser))] 
public partial class User {} //Empty class body 
+0

謝謝Bertand,你和@NinjaNye提供了很大的幫助 – Shadi

+0

MetadataType在這裏與僅僅使用':'關鍵字擴展接口有什麼不同? –