我刚刚加入了一家新公司,我的经理也加入了,他想改变我们的计划方式。基本上做他做的事。我想知道有什么区别,优点,缺点,限制和问题,如果有任何......那就是样本
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
}
}
请开悟我。并且他想为每个模型类创建不同的元数据和部分类..所涉及的文件太多。
谢谢..我需要一个答案,为什么......如果你认为他的方法很好......我会这样做..但是如果你认为这会在将来引起问题并且会涉及更多的编码......我需要知道
答案 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。
另一种用途可能是您的类是自动生成的,并且您需要在不更改自动生成的代码的情况下为属性添加一些装饰(更多属性)。