2

我正在使用帶有POCO對象的新EntityFramework 4.1以及DataAnnotation框架。使用POCO實體框架時丟失數據註釋4

當EntityFramework需要創建代理類(例如,延遲加載虛擬屬性)時,我的所有數據註釋都會丟失。有沒有什麼方法可以讓我的ModelMetaData來自被代理的類,而不是代理類?

我知道我可以選擇禁用代理創建(context.Configuration.ProxyCreationEnabled),但這似乎是一個不好的答案。這應該是已經解決的問題,我想。

下面是一些示例代碼:

public class Person 
{ 
    [Required, Display(Name = "Display That Name")] 
    public string DisplayName { get; set; } 
} 

然後在視圖中的我的模型元數據類型是:Person_9C92B92D56F6F4F0FB1686526D585438A05323CC72E457C2152796E8866297E1 (FullName = "System.Data.Entity.DynamicProxies.Person_9C92B92D56F6F4F0FB1686526D585438A05323CC72E457C2152796E8866297E1"}),我的元數據消失了,顯示名稱爲「顯示名稱」而不是「顯示呈現出名稱」。

有什麼建議嗎?

回答

0

我想出了一個可能的解決方案。不知道是否有更好的。首先,我寫了一個新的ModelMetadataProvider:

public class IgnoreProxiesDataAnnotationsModelMetadataProvider : System.Web.Mvc.DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
    { 
     modelType = ObjectContext.GetObjectType(modelType); 
     containerType = ObjectContext.GetObjectType(containerType); 

     return base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
    } 
} 

然後註冊它的Global.asax應用程序啓動:

ModelMetadataProviders.Current = new IgnoreProxiesDataAnnotationsModelMetadataProvider(); 

如果有一個更好的解決方案,請讓我知道!

+0

要確定一個類型代理它的'小'更容易使用ObjectContext.GetObjectType。 – jamie

+0

@jamie謝謝,我剛剛編輯使用您的建議! –

1

我們做的是如下:

修改T4模板來生成局部類的實體。

對於您希望添加註釋的實體,請創建一個與您的實體同名的部分類。

在此類中創建一個提供註釋詳細信息的夥伴類。

應用部分類頂部的屬性來指定您的好友類是可以找到註釋詳細信息的位置。

在這裏看到更多的細節http://msdn.microsoft.com/en-us/library/ee256141.aspx

6

你可以讓你的模型類的元數據版本。 我們這樣做...... EF產生的東西永遠不會被人手觸動。

讓說你有一個Person類:

public partial class Person 
{ 
     public int idPerson { get; set; } 
     public int idTenant { get; set; } 
     public string Name { get; set; } 
} 

然後你可以把元數據類,保存元數據並不會被overrided:

[MetadataType(typeof(PersonMD))] 
    public partial class Person 
    { 
     //leave it empty 
    } 

    public partial class PersonMD 
    { 
     [Required] 
     public int idPerson { get; set; } 

     [Required] 
     public int idTenant { get; set; } 

     [Required, Display(Name = "Display That Name")] 
     public string Name { get; set; } 
    }