我似乎理解在发生MetadataTypeAttribute时使用向模型中添加验证帮助数据库优先的原因,因为我们希望避免下一次从数据库生成模型时被覆盖的更改。
我注意到很少有人使用MetadataType定义验证,即使在使用代码优先方法时也是如此,而且他们的实体类不可能被某种自动生成的代码覆盖。
不直接将这些DataAnnotations应用于实际的实体类,而是将这些类划分为部分类定义,然后使用MetadataType进行链接,即使在使用代码优先方法定义实体模型时,这样做有意义吗?
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;}
}发布于 2016-10-03 14:50:02
不直接将这些DataAnnotations应用于实际的实体类,而是将这些类划分为部分类定义,然后使用MetadataType进行链接,即使在使用代码优先方法定义实体模型时,这样做有意义吗?
在大多数情况下,这是没有意义的,因为它涉及不必要的、冗余的代码复制,只是为了将一些属性与属性关联起来。
如果实体类模型是由您用代码创建的,那就没有意义了。
如果它是由您控制的某些自定义代码生成(如T4模板)创建的,那么它也没有意义,因为您可以自定义生成本身。
唯一有意义的情况是当您无法控制实体类代码时(例如,来自第三方库的类)。在这种情况下,可以使用AssociatedMetadataTypeTypeDescriptionProvider类将元数据与第三方类关联起来。
例如,假设以下类来自没有源代码的另一个库:
public sealed class ExternalEntity
{
public string Name { get; set;}
}然后可以定义元数据类:
public class ExternalEntityMetadata
{
[Required]
public string Name { get; set;}
}并将其与使用ExternalEntity方法的TypeDescriptor.AddProvider方法关联一次(在应用程序启动或其他什么期间):
TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(
typeof(ExternalEntity), typeof(ExternalEntityMetadata),
typeof(ExternalEntity));发布于 2016-10-02 08:35:39
创建一个类并多次使用它是非常有意义的。在代码优先方法中,您需要数据验证,这可以通过使用数据注释来实现,并且当您有许多具有相同功能的道具时,这样做会更容易。这不仅仅是关于覆盖,在这种情况下,它还有其他一些原因。希望能很好地理解你的问题,我的回答是恰当的。
发布于 2016-09-30 20:36:16
我不知道您为什么要使用数据库优先技术来实现更完整的,比如说,代码优先,因为您可以创建_ViewModel_s以满足您的目的。此外,实体框架中并不支持所有的数据注释。
MetadataType限制
使用MetadataType的缺点
ViewBag、ViewData或其他工具将附加信息传递给视图。如果要向类中的现有属性添加属性(部分):
这可能有效,也可能被EF忽略,测试它:
public partial class YourModelClass
{
public string YourProperty{get;set;}
}
//Your Partial Class
[MetadataType(typeof(YourModelClassMetaData))]
public partial class YourModelClass
{
}
//The class that adds your attributes
public class YourModelClassMetaData
{
[Required]
public object YourProperty{get;set;}
}https://stackoverflow.com/questions/38940443
复制相似问题