92

有没有办法可以生成这样的代码文件:

public partial class A 
{
    public string a { get; set; }
}

然后在另一个文件中:

public partial class A 
{
    [Attribute("etc")]
    public string a { get; set; }
}

这样我就可以从数据库生成一个类,然后使用一个非生成的文件来标记它?

4

5 回答 5

94

这是我一直用于此类情况的解决方案。当您有想要用属性装饰的自动生成的类时,它很有用。假设这是自动生成的类:

public partial class UserProfile
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

比方说,我想添加一个属性来指定 UserId 是键。然后我会在另一个文件中创建一个部分类,如下所示:

[Table("UserProfile")]
[MetadataType(typeof(UserProfileMetadata))]
public partial class UserProfile
{
    internal sealed class UserProfileMetadata
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
    }
}
于 2013-10-19T04:33:45.170 回答
35

我在 Scott Guthrie 的一篇文章中看到过类似的事情(接近结尾)——不过,我自己并没有尝试过。
http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

[MetadataType(typeof(Person_Validation))]
public partial class Person
{
    // Partial class compiled with code produced by VS designer
}

[Bind(Exclude="ID")]
public class Person_Validation
{
    [Required(ErrorMessage = "First Name Required")]
    [StringLength(50, ErrorMessage = "Must be under 50 characters")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name Required")]
    [StringLength(50, ErrorMessage = "Must be under 50 characters")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Age Required")]
    [Range(0, 120, ErrorMessage = "Age must be between 0 and 120")]
    public int Age { get; set; }

    [Required(ErrorMessage = "Email Required")]
    [Email(ErrorMessage = "Not a valid email")]
    public string Email { get; set; }
}
于 2010-09-23T21:05:06.843 回答
3

这是我对不同类文件的回答
,或者您可以将元数据组合在同一个文件中但保持名称空间相同..这样他们就可以明显地看到对方。

请记住,当您更新模型(例如添加更多列)时,您也必须更新项目类。

--your model class
public partial class A {
    public string a {get; set;}
}

--your project class 
public class Ametadata {
     [Attribute("etc")]
     public string a {get; set;}
}


[MetadataType(typeof(Ametadata))]
public partial class A
{
}
于 2017-02-24T16:34:24.407 回答
1

您需要为您的类定义一个部分类,A就像下面的示例一样

using System.ComponentModel.DataAnnotations;

// your auto-generated partial class
public partial class A 
{
    public string MyProp { get; set; }
}

[MetadataType(typeof(AMetaData))]
public partial class A 
{

}

public class AMetaData
{
    [System.ComponentModel.DefaultValue(0)]
    public string MyProp { get; set; }
}
于 2017-11-04T08:12:00.680 回答
0

不是这样的;编译器会抱怨该成员是在多个部分中定义的。但是,由于自定义属性的使用本质上是反射性的,您可以定义一个“元数据”类并使用它来包含装饰器。

public class A
{
   public string MyString;
}

public class AMeta
{
   [TheAttribute("etc")]
   public object MyString;
}

...

var myA = new A();
var metaType = Type.GetType(myA.GetType().Name + "Meta");
var attributesOfMyString = metaType.GetMember("MyString").GetCustomAttributes();
于 2010-09-23T20:58:12.097 回答