2011-07-21 56 views
9

我想爲我的應用程序使用MVC 3和實體框架。使用實體框架模型/數據庫首先進行MVC3驗證

該模型將存儲在與MVC應用程序不同的程序集中。

我正在做的選擇是使用EF來生成我的實體或首先使用代碼。

隨着代碼第一,我可以用[必填]等裝飾成員......但如果EF已經從數據庫中生成實體,我將如何去添加這些屬性?

讓EF生成我的實體會節省很多時間,但是我希望MVC自動填充驗證,具體取決於我如何裝飾我的成員。這有意義嗎?如果是這樣,我該怎麼做?

回答

11

在這種情況下,使用MetadataTypeAttribute。您可以將其與部分類組合以實現預期的結果

順便說一下,在您決定使用Database First和Code First設計之間的時候,我會做更多的研究。這一切都不是關於生成實體時節省時間,這兩種方法之間的差異更大。爲了節省時間,您可以使用EF Power Tools從數據庫生成代碼優先實體 - 很簡單。比汽車

+0

謝謝,當我這樣做時,我得到曖昧的名稱錯誤。這裏是我在我的部分類(該實體稱爲模型中的項目)中的內容: – Paul

+0

[MetadataType(typeof(Item))] public partial class Item { [StringLength(10),必需] public字符串MaterialName { get; 集; } } – Paul

+0

保羅,模糊'可能'與預先存在的edmx ef文件可能? –

2

更好地生成你的實體,我建議你使用代碼優先或現有的數據庫映射到POCO的類(不產生實體,只是用手工創建它們,並將它們映射到現有的數據庫)

Scottgu寫了關於using EF "Code First" with an existing database

1

檢查了這一點: 在你的模型模板(擴展model.tt文件),你可以破解這個模板生成的裝飾,在這個例子中,我添加[必填]裝飾加上一條錯誤消息

var simpleProperties = typeMapper.GetSimpleProperties(entity); 
if (simpleProperties.Any()) 
{ 
    foreach (var edmProperty in simpleProperties) 
    { 
     if(!edmProperty.Nullable) 
     {#> 
[Required(ErrorMessage="<#=String.Format("The field {0} is required",edmProperty.ToString())#>")]<# 
     }#> 
<#=codeStringGenerator.Property(edmProperty)#><# 
    } 
} 

所以結果是這樣的

[Required(ErrorMessage="The field Id is required")] 
    public long Id { get; set; } 

PS:您還可以通過編輯模板添加 using System.ComponentModel.DataAnnotations;

希望這可以幫助你。

相關問題