首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >首先使用MetadataType来执行代码验证是否有意义?

首先使用MetadataType来执行代码验证是否有意义?
EN

Stack Overflow用户
提问于 2016-08-14 08:23:22
回答 4查看 5.2K关注 0票数 18

我似乎理解在发生MetadataTypeAttribute时使用向模型中添加验证帮助数据库优先的原因,因为我们希望避免下一次从数据库生成模型时被覆盖的更改。

我注意到很少有人使用MetadataType定义验证,即使在使用代码优先方法时也是如此,而且他们的实体类不可能被某种自动生成的代码覆盖。

不直接将这些DataAnnotations应用于实际的实体类,而是将这些类划分为部分类定义,然后使用MetadataType进行链接,即使在使用代码优先方法定义实体模型时,这样做有意义吗?

代码语言:javascript
复制
public class MyEntity
{
    [Required]
    public string Name { get; set;}
}

vs

代码语言:javascript
复制
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;}
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-03 14:50:02

不直接将这些DataAnnotations应用于实际的实体类,而是将这些类划分为部分类定义,然后使用MetadataType进行链接,即使在使用代码优先方法定义实体模型时,这样做有意义吗?

在大多数情况下,这是没有意义的,因为它涉及不必要的、冗余的代码复制,只是为了将一些属性与属性关联起来。

如果实体类模型是由您用代码创建的,那就没有意义了。

如果它是由您控制的某些自定义代码生成(如T4模板)创建的,那么它也没有意义,因为您可以自定义生成本身。

唯一有意义的情况是当您无法控制实体类代码时(例如,来自第三方库的类)。在这种情况下,可以使用AssociatedMetadataTypeTypeDescriptionProvider类将元数据与第三方类关联起来。

例如,假设以下类来自没有源代码的另一个库:

代码语言:javascript
复制
public sealed class ExternalEntity
{
    public string Name { get; set;}
}

然后可以定义元数据类:

代码语言:javascript
复制
public class ExternalEntityMetadata
{
    [Required]
    public string Name { get; set;}
}

并将其与使用ExternalEntity方法的TypeDescriptor.AddProvider方法关联一次(在应用程序启动或其他什么期间):

代码语言:javascript
复制
TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(
    typeof(ExternalEntity), typeof(ExternalEntityMetadata),
    typeof(ExternalEntity));
票数 16
EN

Stack Overflow用户

发布于 2016-10-02 08:35:39

创建一个类并多次使用它是非常有意义的。在代码优先方法中,您需要数据验证,这可以通过使用数据注释来实现,并且当您有许多具有相同功能的道具时,这样做会更容易。这不仅仅是关于覆盖,在这种情况下,它还有其他一些原因。希望能很好地理解你的问题,我的回答是恰当的。

票数 1
EN

Stack Overflow用户

发布于 2016-09-30 20:36:16

我不知道您为什么要使用数据库优先技术来实现更完整的,比如说,代码优先,因为您可以创建_ViewModel_s以满足您的目的。此外,实体框架中并不支持所有的数据注释。

MetadataType限制

  1. 它不能应用于属性,只能应用于每个类类型的单个类。
  2. 不能继承此属性,因此不能自定义它。
  3. 另一方面,该属性可以应用于部分类,这是该属性的主要用途。
  4. 这个属性将被ASP.NET MVC所尊重,但不会被实体框架读取。

使用MetadataType的缺点

  • 您必须使用ViewBagViewData或其他工具将附加信息传递给视图。
  • 您的设计缺乏可测试性,因为它依赖于静态对象机制。
  • 它也是不需要的,有人可以省略它而不破坏任何东西。
  • 这也意味着您要将模型类拆分为3个文件。一个是生成的,一个是你的,另一个是有属性的。

如果要向类中的现有属性添加属性(部分):

这可能有效,也可能被EF忽略,测试它:

代码语言:javascript
复制
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;}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38940443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档