我似乎明白寻求帮助背后的原因MetadataTypeAttribute
to 向模型添加验证 http://www.asp.net/mvc/overview/getting-started/database-first-development/enhancing-data-validation的情况下数据库优先 https://msdn.microsoft.com/en-us/data/ee712907#efdesigner因为我们希望避免下次从数据库生成模型时覆盖更改。
我注意到很少有人使用定义验证MetadataType
即使他们正在使用代码优先 https://msdn.microsoft.com/en-us/data/ee712907#codefirst方法,并且它们的实体类不可能被某种自动生成的代码覆盖。
不直接将这些 DataAnnotations 应用于实际的实体类,而是将它们分成部分类定义,然后使用链接是否有意义MetadataType
,即使使用时代码优先 https://msdn.microsoft.com/en-us/data/ee712907#codefirst定义实体模型的方法?
public class MyEntity
{
[Required]
public string Name { get; set;}
}
vs
public partial class MyEntity
{
public string Name { get; set;}
}
[MetadataType(typeof(MyEntityMetadata))]
public partial class MyEntity
{
}
public class MyEntityMetadata
{
[Required]
public string Name { get; set;}
}
即使使用 Code First 方法定义实体模型,不直接将这些 DataAnnotations 应用于实际实体类,而是将它们分成部分类定义,然后使用 MetadataType 进行链接是否有意义?
在大多数情况下,它没有意义,因为仅仅为了将某些属性与属性相关联就涉及不必要的冗余代码重复。
如果实体类模型是你用代码创建的,那就没有意义了。
如果它是使用您可以控制的某些自定义代码生成(例如 T4 模板)创建的,那么它也没有意义,因为您可以自定义生成本身。
唯一有意义的情况是您无法控制实体类代码(例如,来自第三方库的类)。在这种情况下,您可以使用AssociatedMetadataTypeTypeDescriptionProvider https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.associatedmetadatatypetypedescriptionprovider(v=vs.110).aspx将元数据与第 3 方类相关联的类。
例如,假设以下类来自另一个没有源代码的库:
public sealed class ExternalEntity
{
public string Name { get; set;}
}
然后您可以定义元数据类:
public class ExternalEntityMetadata
{
[Required]
public string Name { get; set;}
}
并将其与ExternalEntity
using TypeDescriptor.AddProvider https://msdn.microsoft.com/en-us/library/1x0wz2y6(v=vs.110).aspx方法一次(在应用程序启动或其他过程中):
TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(
typeof(ExternalEntity), typeof(ExternalEntityMetadata),
typeof(ExternalEntity));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)