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

Cyb*_*nja 2 c# model-view-controller ado.net-entity-data-model entity-framework-6

我刚加入一家新公司,我的经理也加入了,他想改变我们的计划方式.基本上做他做的事.我想知道有什么区别,优点,缺点,限制和问题,如果有任何......那就是样本

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; }
}

}
Run Code Online (Sandbox Code Playgroud)

这是元数据:

    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; }
         }
   }
Run Code Online (Sandbox Code Playgroud)

这是部分的:

    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
       }
  }
Run Code Online (Sandbox Code Playgroud)

请开明我.并且他想为每个模型类创建不同的元数据和部分类..所涉及的文件太多.

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

Cod*_*ter 7

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

这会导致public partial class MyClass重新生成EDMX下包含的文件.因此,您无法更改它,因为下次有人刷新表或添加一个表时,您的更改就会消失.

这就是为什么实体类是作为部分生成的:所以你可以创建另一个部分到同一个类来进行修改.

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

// 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;} 
}
Run Code Online (Sandbox Code Playgroud)

因为该代码表示​​您需要NameFooEntity类中命名的两个属性,这是无效的.

因此,您必须提出另一种方法来向该类型添加元数据.输入[MetadataType]属性.这通过创建一个与要注释的类具有相同属性的类来工作.这里,使用反射,基于成员名称解析元数据.

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

public class FooEntityMetadata
{
    [Required]
    public string Name { get; set;} 
}
Run Code Online (Sandbox Code Playgroud)

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

// User-created partial class
[MetadataType(typeof(FooEntityMetadata))]
public partial class FooEntity
{
}
Run Code Online (Sandbox Code Playgroud)

而且,在后一部分中,您可以添加向实体模型添加功能的成员.例如,New([NotMapped])属性和新方法.