我使用MVC3 VS2010與EF4.1,我一直在使用SQL Server創建我的數據庫,我將其導入到MVC3 Web應用程序。更新型號從數據庫(數據庫優先)
當我從數據庫中更新模型時,我遇到了一些挑戰我丟失了所有模型文件修改,例如,如果我在某些模型中使用屬性進行驗證或者所有被新模型覆蓋屬性。
是否有從數據庫更新模型而不會丟失模型的信息?
OR
我應該在哪裏對我的模型定義的驗證,而不是直接使用模型的文件?
我使用MVC3 VS2010與EF4.1,我一直在使用SQL Server創建我的數據庫,我將其導入到MVC3 Web應用程序。更新型號從數據庫(數據庫優先)
當我從數據庫中更新模型時,我遇到了一些挑戰我丟失了所有模型文件修改,例如,如果我在某些模型中使用屬性進行驗證或者所有被新模型覆蓋屬性。
是否有從數據庫更新模型而不會丟失模型的信息?
OR
我應該在哪裏對我的模型定義的驗證,而不是直接使用模型的文件?
更新:由於這還是比較受歡迎的,我創建這個博客帖子。
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/
任何設計師的第一條規則是:它會生成無法修改它,因爲它會被徹底刪除您下次更新在設計任何事情的任何代碼。
所有生成的類部分,所以你可以創建自己的一部分的區域,並把您的定製邏輯存在。您顯然不能將屬性添加到在自動生成的零件中定義的屬性。在數據註釋的情況下,可以通過buddy classes或定製的T4模板來實現,該模板將包含您自己的邏輯,以決定在代碼生成期間應添加哪些數據註釋。這兩種情況通常都被認爲是不好的做法,因爲您應該爲每個視圖分別創建視圖模型,並且需要對該視圖進行驗證。
不,這些文件每次都會重新生成。
所有類被定義爲局部,因此您可以輕鬆地添加使用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
謝謝Bertand,你和@NinjaNye提供了很大的幫助 – Shadi
MetadataType在這裏與僅僅使用':'關鍵字擴展接口有什麼不同? –
所以每次模型再生我必須回去爲每個文件並重新定義我的[MetadataTypeAttribute(typeof運算()]屬性。謝謝@NinjaNye但這是不實際的,我的時間。 – Shadi
不,你只會需要定義一個新屬性的驗證,你必須做任何事情,局部類和元數據類不會被覆蓋或替換 – NinjaNye
對不起,我應該更清楚一點,在單獨的一個單獨的類中定義你的部分類和元數據類文件,而不是在自動生成的文件中。我將更新我的答案 – NinjaNye