Asp.net mvc 3 使用POCO实体框架4时丢失数据批注

Asp.net mvc 3 使用POCO实体框架4时丢失数据批注,asp.net-mvc-3,entity-framework-4,entity-framework-4.1,data-annotations,poco,Asp.net Mvc 3,Entity Framework 4,Entity Framework 4.1,Data Annotations,Poco,我将新的EntityFramework 4.1与POCO对象一起使用,并与DataAnnotation框架结合使用 当EntityFramework需要创建代理类(例如,延迟加载虚拟属性)时,我的所有数据批注都将丢失。是否有某种方式可以使我的ModelMetaData来自被代理的类而不是代理类 我知道我可以选择禁用代理创建(context.Configuration.ProxyCreationEnabled),但这似乎是一个糟糕的答案。我想这应该已经解决了 下面是一些示例代码: public c

我将新的EntityFramework 4.1与POCO对象一起使用,并与DataAnnotation框架结合使用

当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”)
,我的元数据消失了,显示名显示在“displayname”处“显示该名称”


有什么建议吗?

我想出了一个可能的解决方案。不确定是否有更好的解决方案。首先,我编写了一个新的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);
    }
}

如果有更好的解决方案,请告诉我!

我们的做法如下:

修改T4模板以生成实体的分部类

对于要向其添加注释的实体,请创建与实体同名的分部类

在此类中创建一个buddy类,该类提供您的注释详细信息

应用分部类顶部的属性,以指定可以在buddy类中找到注释详细信息


有关更多详细信息,请参见此处

您可以制作模型类的元数据版本。 我们是这样做的…EF产生的东西从来没有用手触摸过

假设您有一个人类:

public partial class Person
{
        public int idPerson { get; set; }
        public int idTenant { get; set; }
        public string Name { get; set; }
}
然后可以创建元数据类,该类保存元数据并且不会被覆盖:

[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; }
    }

要确定类型是否被代理,使用ObjectContext.GetObjectType“稍微”容易一些。
[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; }
    }