为模型类c#

时间:2016-12-15 17:56:20

标签: c# model-view-controller entity-framework-6 ado.net-entity-data-model

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

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

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

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

2 个答案:

答案 0 :(得分:6)

每次保存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;} 
}

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

因此,您必须提出另一种方法来向该类型添加元数据。输入[MetadataType]属性。这可以通过创建 new 类来实现,其中相同的属性与要注释的类相同。在这里,使用反射,元数据将根据成员名称进行解析。

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

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

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

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

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

答案 1 :(得分:0)

我认为一次使用可能是不污染主类。

例如,如果您有很多用于验证的属性(使用数据注释)并且您不希望在主类中使用它们,则可以使用MetadataTypeAttribute

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