为模型 class c# 创建元数据 class 和部分 class 有什么用
what 's the use of creating a metadata class and a partial class for the model class 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
}
}
请赐教。他想为每个模型 class 创建不同的元数据和部分 classes。涉及的文件太多了。
谢谢..我需要一个关于为什么的答案..如果你认为他的方法很好..我会这样做..但如果你认为这会在未来造成问题并且涉及更多编码..我需要知道
我认为一个用途可能是不污染主要 class。
例如,如果您有很多用于验证的属性(使用数据注释)并且您不想将它们放在主 class 中,您可以为此使用 MetadataTypeAttribute。
如果您的 class 是自动生成的并且您需要在不更改自动生成的代码的情况下向您的属性添加一些装饰(更多属性),则可能会有另一种用途。
您显示的第一个 class,即实体 classes,是在您每次保存 EDMX(或执行 T4 模板时)时从数据库生成的。
这会导致重新生成 EDMX 下包含 public partial class MyClass
的文件。所以你不能改变它,因为下次有人刷新 table 或添加一个时,你的更改就消失了。
这就是实体 class 生成为部分的原因:因此您可以创建另一个部分到相同的 class 以在其中进行修改。
但是,如果你想用元数据注释你的实体的属性,你不能在另一个部分重新定义相同的属性 class:相同的名称只能由一个成员使用类型。所以你不能这样做:
// 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
class 中的两个名为 Name
的属性,这是无效的。
所以你必须想出另一种方法来向类型添加元数据。输入 [MetadataType]
属性。这是通过创建一个 new class 来实现的,它具有与要注释的 class 相同的 属性。在这里,使用反射,根据成员名称解析元数据。
因此,当您为上述注释创建元数据 class 时:
public class FooEntityMetadata
{
[Required]
public string Name { get; set;}
}
您可以将其应用于用户创建的部分:
// User-created partial class
[MetadataType(typeof(FooEntityMetadata))]
public partial class FooEntity
{
}
而且,在后一部分中,您可以添加成员,为实体模型添加功能。例如新的 ([NotMapped]
) 属性和新方法。
我刚加入一家新公司,我的经理也刚加入,他想改变我们编程的方式。基本上做他做的事。我想知道有什么区别、优点、缺点、限制和问题,如果有的话……这是示例
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
}
}
请赐教。他想为每个模型 class 创建不同的元数据和部分 classes。涉及的文件太多了。
谢谢..我需要一个关于为什么的答案..如果你认为他的方法很好..我会这样做..但如果你认为这会在未来造成问题并且涉及更多编码..我需要知道
我认为一个用途可能是不污染主要 class。
例如,如果您有很多用于验证的属性(使用数据注释)并且您不想将它们放在主 class 中,您可以为此使用 MetadataTypeAttribute。
如果您的 class 是自动生成的并且您需要在不更改自动生成的代码的情况下向您的属性添加一些装饰(更多属性),则可能会有另一种用途。
您显示的第一个 class,即实体 classes,是在您每次保存 EDMX(或执行 T4 模板时)时从数据库生成的。
这会导致重新生成 EDMX 下包含 public partial class MyClass
的文件。所以你不能改变它,因为下次有人刷新 table 或添加一个时,你的更改就消失了。
这就是实体 class 生成为部分的原因:因此您可以创建另一个部分到相同的 class 以在其中进行修改。
但是,如果你想用元数据注释你的实体的属性,你不能在另一个部分重新定义相同的属性 class:相同的名称只能由一个成员使用类型。所以你不能这样做:
// 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
class 中的两个名为 Name
的属性,这是无效的。
所以你必须想出另一种方法来向类型添加元数据。输入 [MetadataType]
属性。这是通过创建一个 new class 来实现的,它具有与要注释的 class 相同的 属性。在这里,使用反射,根据成员名称解析元数据。
因此,当您为上述注释创建元数据 class 时:
public class FooEntityMetadata
{
[Required]
public string Name { get; set;}
}
您可以将其应用于用户创建的部分:
// User-created partial class
[MetadataType(typeof(FooEntityMetadata))]
public partial class FooEntity
{
}
而且,在后一部分中,您可以添加成员,为实体模型添加功能。例如新的 ([NotMapped]
) 属性和新方法。