我似乎理解在“数据库优先”的情况下帮助MetadataTypeAttribute
向模型添加验证的背后原因,因为我们希望避免下次从数据库生成模型时所做的更改被覆盖。
我注意到,MetadataType
即使使用代码优先方法,也很少有人定义使用验证,并且他们的实体类不会被某种自动生成的代码覆盖。
不直接将这些DataAnnotation应用于实际的Entity类,而是将它们分成部分类定义,然后使用进行链接MetadataType
,即使使用“代码优先”方法来定义实体模型,这也有意义吗?
public class MyEntity
{
[Required]
public string Name { get; set;}
}
与
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;}
}
不直接将这些DataAnnotation应用于实际的Entity类是否有意义,而是将它们分成部分类定义,然后使用MetadataType进行链接,即使使用Code First方法定义实体模型也有意义吗?
在大多数情况下,这是没有意义的,因为它涉及不必要的和冗余的代码重复,只是为了将某些属性与属性相关联。
如果实体类模型是由您使用代码创建的,则没有任何意义。
如果它是由您可以控制的某些自定义代码生成(例如T4模板)创建的,也没有任何意义,因为您可以自定义生成本身。
唯一有意义的情况是您无法控制实体类代码(例如,来自第三方库的类)。在这种情况下,您可以使用AssociatedMetadataTypeTypeDescriptionProvider
类将元数据与第三方类关联。
例如,假设以下类来自另一个没有源代码的库:
public sealed class ExternalEntity
{
public string Name { get; set;}
}
然后,您可以定义元数据类:
public class ExternalEntityMetadata
{
[Required]
public string Name { get; set;}
}
并将其与ExternalEntity
usingTypeDescriptor.AddProvider
方法关联一次(在应用程序启动期间或其他过程中):
TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(
typeof(ExternalEntity), typeof(ExternalEntityMetadata),
typeof(ExternalEntity));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句