1

我刚加入一家新公司,我的经理也加入了,他想改变我们的计划。基本上做他做的事情。我不知道有什么区别,优点,缺点,限制和问题,如果有会any..here的样品什么是为模型类创建元数据类和部分类的用法#

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

请赐教。他希望为每个模型类别创建不同的元数据和部分类。

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

+2

为什么不问他他 – pm100

+0

他没有解释..他只是想让我们这样做..coz这就是他如何学习它..他也是mvc的新手。 – CyberNinja

+0

好好思考一下。如果MyClass是自动生成的,并为其添加数据注释属性。如果你改变模型会发生什么? 我认为他的建议在这种情况下是好的。 –

回答

0

我认为一个用法可能是不污染主类。

例如,如果您有很多验证属性(使用dataannotation),并且您不想让它们在主类中,那么可以使用MetadataTypeAttribute

另一个用法是如果您的类是自动生成的,并且您需要向属性添加一些装饰(更多属性)而不更改自动生成的代码。

3

您每次保存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]属性。这可以通过创建一个新的类和相同的属性作为要注释的类。在这里,使用反射,元数据根据成员名称解析。

所以,当你创建元数据类以上注释:

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

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

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

而且也,在后者的部分,你可以添加为实体模型添加功能的成员。例如新([NotMapped])属性和新方法。

+0

感谢这..因此分部类名称应该不同于实体模型类名称?因为他改变了我的部分类名称与实体的相同。加上名称空间应该匹配模型'?这整个设置如何映射到模型? – CyberNinja

+0

当您在多个部分定义中分割一个类时,包含名称空间的全名必须匹配,否则最终会生成两个不相关的类。元数据类必须具有不同的名称。我不知道你的意思是“如何映射到模型”。 – CodeCaster

+0

我明白了.....课堂偏好..我错过了,很感谢.. – CyberNinja