2012-01-14 3 views
2

Я не могу прикрепить метаданные к автогенерируемому классу в нашем приложении. Я тестировал установку атрибута Order в сгенерированном классе, и он работает нормально, но если попытаться использовать другой класс, я не могу получить атрибуты позже.DataAnnotations MetadataType не работает

Я также уже пробовал предлагаемое решение here без каких-либо успехов.

Сгенерированный класс

[Table(Name = "T_MKT_Product")] 
public partial class T_MKT_Product : GlobalSist.DataAccess.Base.BaseEntity 
{ 
    [Column(Storage = "_code", DbType = "varchar(20)", IsUnique = true)] 
    public virtual string Code 
    { 
     get { return _code; } 
     set 
     { 
      if (_code != value) 
      { 
       OnPropertyChanging("Code"); 
       _code = value; 
       OnPropertyChanged("Code"); 
      } 
     } 
    } 

    [Column(Storage = "_name", DbType = "varchar(200)")] 
    public virtual string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name != value) 
      { 
       OnPropertyChanging("Name"); 
       _name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 
    } 

    [Column(Storage = "_description", DbType = "varchar(200)", CanBeNull = true)] 
    public virtual string Description 
    { 
     get { return _description; } 
     set 
     { 
      if (_description != value) 
      { 
       OnPropertyChanging("Description"); 
       _description = value; 
       OnPropertyChanged("Description"); 
      } 
     } 
    } 
} 

Тогда я определил следующие классы

[MetadataType(typeof(ProductMetaData))] 
public partial class T_MKT_Product 
{ 
} 

public class ProductMetaData 
{ 
    [Display(Order = -1)] 
    public virtual string Code { get; set; } 

    [Display(Order = -2)] 
    public object Name { get; set; } 

    [Display(Order = -3)] 
    public object Description { get; set; } 
} 

Помощь! :)

+0

У вас здесь слишком много сложностей. Упростите код, пока вы не сможете заставить этот атрибут работать, тогда вы найдете свою проблему. Создайте тот же класс без EF и с одним полем. – RickAndMSFT

+0

проверить это, я уже ответил на этот вопрос здесь http://stackoverflow.com/a/24757520/3050647 – elia07

ответ

2

Attribute.IsDefined (currentProp, TypeOf (DisplayAttribute)) по-прежнему Ложные ОН ДОЛЖЕН БЫТЬ ЛОЖЬ. Возможно, вы проверяете заказ с помощью специального кода! Ответ на вашу проблему очень прост: ваш пользовательский код просто НЕПРАВИЛЬНО. Вероятно, это неправильно, потому что вы притворяетесь, что найдете атрибут, добавленный вместе с классом метаданных, вместе со всеми другими «родными» атрибутами класса. ЭТО НЕ ВЕРНО! .Net Clr не имеет никакой поддержки для атрибута MetaDataType! Это просто КОНВЕНЦИЯ. Это зависит от вас, verifyng, что ваш класс имеет MetaDataType и извлекает также атрибуты MetaDataType с тем же именем свойств исходного класса. Я ЗНАЮ, ЧТО ВЫ ДОЛЖНЫ СДЕЛАТЬ ЭТО ЗАДАНИЕ ВПЕРЕДИ. Все атрибуты, которые обрабатывает Mvc-движок автоматически, обрабатываются таким образом ... что Mvc Engine рассматривает атрибуты MetaDataType и объединяет их с собственными атрибутами ... Вы должны сделать то же самое в своем пользовательском коде.

Это, если вам нужен ваш атрибут в представлении ... вместо того, чтобы вручную извлекать атрибуты, напишите пользовательский MetaDataProvider. Логики поставщиков метаданных автоматически извлекают для вас все атрибуты (как я объяснил) ... вам нужно просто указать, какое действие нужно предпринять для каждого из них.

+0

Благодарим вас за объяснение. Вот что я сделал (хотя я не знал, что это невозможно сделать автоматически). –

4

Убедитесь, что пространство имен, в котором указан ваш автогенерированный класс, совпадает с тем, в котором вы определили свой собственный частичный класс. Например:

namespace FooBar 
{ 
    [Table(Name = "T_MKT_Product")] 
    public partial class T_MKT_Product : GlobalSist.DataAccess.Base.BaseEntity 
    { 
     ... 
    } 
} 

и ваш:

namespace FooBar 
{ 
    [MetadataType(typeof(ProductMetaData))] 
    public partial class T_MKT_Product 
    { 
    } 

    public class ProductMetaData 
    { 
     [Display(Order = -1)] 
     public virtual string Code { get; set; } 

     [Display(Order = -2)] 
     public object Name { get; set; } 

     [Display(Order = -3)] 
     public object Description { get; set; } 
    } 
} 
+0

Я пробовал это уже, он не решает проблему. Attribute.IsDefined (currentProp, typeof (DisplayAttribute)) по-прежнему False –

+0

@Darin Dimitrov ----- какой из них верно: 1) оба класса должны быть одинаковыми, 2) пространство имен должно быть одинаковым. 3) оба класса должны быть частичными, 4) Все должно быть истинным. –

Смежные вопросы