有没有一种方法可以让我生成这样的代码文件:
public partial class A {
public string a {get; set;}
}
然后在另一个文件中:
public partial class A {
[Attribute("etc")]
public string a {get; set;}
}
这样我就可以从数据库生成一个类,然后使用一个非生成的文件对其进行标记?
有没有一种方法可以让我生成这样的代码文件:
public partial class A {
public string a {get; set;}
}
然后在另一个文件中:
public partial class A {
[Attribute("etc")]
public string a {get; set;}
}
这样我就可以从数据库生成一个类,然后使用一个非生成的文件对其进行标记?
Answers:
我已经在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; }
}
MetadataType
属性放在设计人员生成的文件中,而是将其放在Person
定义了局部类的另一个文件中。
这是我在这种情况下一直使用的解决方案。当您具有要用属性修饰的自动生成的类时,此功能很有用。假设这是自动生成的类:
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; }
}
}
MetadataType
属性的连接。做得好!
UserProfile
怎么办?
MetadataType
在.NET的核心不存在
ModelMetadataType
这是我的答案,是
不同的类文件,或者您可以将元数据合并在同一个文件中,但要使命名空间相同。
在更新模型时请记住,例如添加更多列,您也必须更新项目类。
--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
{
}
您需要为您的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; }
}
并非如此;编译器会抱怨该成员定义为多个部分。但是,由于自定义属性的使用本质上是反射性的,因此您可以定义“元数据”类并将其包含装饰器。
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();