Asp.net mvc 3 使用POCO实体框架4时丢失数据批注
我将新的EntityFramework 4.1与POCO对象一起使用,并与DataAnnotation框架结合使用 当EntityFramework需要创建代理类(例如,延迟加载虚拟属性)时,我的所有数据批注都将丢失。是否有某种方式可以使我的ModelMetaData来自被代理的类而不是代理类 我知道我可以选择禁用代理创建(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
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; }
}