2016-02-09 23 views
0

我需要添加dataannotation属性到我的实体,但我的实体以外。为什么?我所有的类都是由T4生成的,如果我向属性添加一些数据注解(DisplayName,Min,Max等),当我重新运行T4生成我的实体时,它们将会丢失。我希望实体由T4生成,然后在另一个类中执行如下操作:添加DataAnnotations到实体类以外的属性

Dog.Name.AddDataannotation(new DisplayNameDataAnnotation(“My dog”));

类会是这样的

public class Dog 
{ 
    public int DogId { get; set; } 
    public string Name { get; set; } 
} 

它会像对dataannotations一口流利的API。这样我就可以将我的数据注解从我的实体中分离出来,我可以在不丢失它们的情况下重新生成它们。如果有人问我不能使用DTO。另一件事,我有一个基于DataAnnotations验证实体的类,我想继续工作。

是否有可能做到这样的事情?

感谢和抱歉我的英语!

回答

1

MetadataTypeAttribute旨在处理这种情况。这不是很好,但应该工作。

采取的步骤如下:

  • 确保您生成的类型是partial
  • 对于您要添加元数据,添加一个新的部分类定义每种类型,指定[MetadataType](如[MetadataType(typeof(DogMetadata))]]
  • 重新定义的属性在DogMetadata,添加属性有

完全EXA简单:

//dog.generated.cs 
partial class Dog 
{ 
    public int DogId { get; set; } 
    public string Name { get; set; } 
} 

//dog.cs 
[MetadataType(typeof(DogMetadata))] 
partial class Dog {} 

class DogMetadata 
{ 
    [DisplayName("My dog")] 
    public string Name { get; set; } 
} 
+0

哇,太可怕了!!!我不是说你的回答(很好的答案),处理场景的方式!但是有一个问题,在我的理想场景Dog.Name.AddDataannotation(新的DisplayNameDataAnnotation(“My dog”))中,将Dog类的Name属性更改为Name1。会抛出异常,因为Name更改为Name1。在示例中,您向我展示了这不会发生,Dog类将从生成的代码获取Name(来自元数据)和Name1。我的解释是否正确?如果我的解释没问题,那么我需要说我不希望发生这种情况! – snekkke

+0

你是对的,那种情况将会惨败。您可以进行一次单元测试,检查metadatatype属性与原始属性,以确保它们存在。 – Bas

+0

嘿,那个很好!但是,如果两者都是DOG类,你如何做比较? – snekkke

相关问题