为模型类 C# 创建元数据类和分部类有什么用



我刚刚加入了一家新公司,我的经理也加入了,他想改变我们的编程方式。基本上做他的工作。我想知道有什么区别,优点,缺点,限制和问题,如果有的话。

namespace Models //this is the model part of from edmx
{
using System;
using System.Collections.Generic;

public partial class MyModelClass
{
    public int ID { get; set; }
    public Nullable<System.DateTime> PostDate { get; set; }
    public string MyContent { get; set; }
}
}

这是元数据:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    namespace Models
    {
         public class MyModelMetaData
         {
           //he wants all data annotation here
           public int ID { get; set; }
           public Nullable<System.DateTime> PostDate { get; set; }
           public string MyContent { get; set; }
         }
   }

这是部分:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Web;
    namespace Models
   {
        [MetadataType(typeof(MyModelMetaData))]
        public partial class MyModelClass or MyModelClassPartial
        {
           //He wants the programming algorithm to go here
       }
  }

请启发我。他想每个型号类别创建不同的元数据和部分类别。

谢谢..我需要一个答案,说明为什么..如果您认为他的方法很好..我会这样做..但是,如果您认为这将来会引起问题,并且更多的编码会涉及。我需要知道

您显示的第一类,即实体类,每次保存EDMX时都会从数据库中生成(或执行T4模板时)。

这会导致EDMX下包含public partial class MyClass的文件被再生。因此,您无法更改它,因为下次有人刷新桌子或添加一张时,您的更改就消失了。

这就是为什么将实体类作为部分生成的原因:因此,您可以在同一类中创建另一部分以进行修改。

但是,如果要用元数据注释实体的属性,则不能重新定义另一个部分类别中的相同属性:同一名称只能由类型的一个成员使用。所以你不能这样做:

// Entity class
public partial class FooEntity
{
    public string Name { get; set;} 
}
// User-created partial class
public partial class FooEntity
{
    [Required]
    public string Name { get; set;} 
}

因为该代码表示您需要两个在FooEntity类中名为Name的属性,这是无效的。

因此,您必须提出另一种方式将元数据添加到类型中。输入[MetadataType]属性。这是通过与要注释的类创建相同属性的 new 类来起作用。在这里,使用反射,基于成员名称解决元数据。

因此,当您为上述注释创建元数据类时:

public class FooEntityMetadata
{
    [Required]
    public string Name { get; set;} 
}

您可以将其应用于用户创建的部分:

// User-created partial class
[MetadataType(typeof(FooEntityMetadata))]
public partial class FooEntity
{
}

以及在后一部分中,您可以添加将功能添加到实体模型的成员。新的([NotMapped])属性和新方法。

我认为一种用途可能是不要污染主类。

例如,如果您有很多用于验证的属性(使用dataannotation),并且您不想将它们放在主类中,则可以将其使用元素质型。

另一种用途可能是您的类是自动生成的,您需要在不更改自动化代码的情况下向您的属性添加一些装饰(更多属性)。

最新更新