Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Программно посмотреть DataAnnotations у свойства модели EF / 19 сообщений из 19, страница 1 из 1
01.10.2013, 16:13
    #38413293
Andrey_VP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Здравствуйте!

Есть класс, модель Entity Framework, с набором свойств (полей).
Поля имеют DataAnnotations, например: [Display(Name="Поле")]

Как программно посмотреть, например, какое значение DataAnnotations.Display у какого-нибудь поля данной модели EF ?
...
Рейтинг: 0 / 0
01.10.2013, 18:06
    #38413445
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Andrey_VPЗдравствуйте!

Есть класс, модель Entity Framework, с набором свойств (полей).
Поля имеют DataAnnotations, например: [Display(Name="Поле")]

Как программно посмотреть, например, какое значение DataAnnotations.Display у какого-нибудь поля данной модели EF ?
1. Рефлекшеном извлечь из классов сущностей.

или

2. Рыться в метаданных EF, живущих в ObjectContext.MetadataWorkspace. Тут решение зависит от версии EF и там не всё задокументировано.
...
Рейтинг: 0 / 0
02.10.2013, 10:46
    #38413948
Andrey_VP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Алексей К, спасибо за подсказки.

Порылся в "метаданных EF, живущих в ObjectContext.MetadataWorkspace", но так ничего и не нашёл.
Пришлось сделать так (функция возвращает значение DataAnnotations.DisplayAttribute.Name для свойства EF модели):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
      public string getDisplayName(Type EFmodel, string EFpropertyName)
        {
            string s="";

            PropertyInfo property = EFmodel.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.Name == EFpropertyName).FirstOrDefault();
            if (property.IsDefined(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), true))
            {
                CustomAttributeData attribute =
                        property.GetCustomAttributesData().Single(x => x.Constructor.DeclaringType == typeof(System.ComponentModel.DataAnnotations.DisplayAttribute));
                s = attribute.NamedArguments.Where(a => a.MemberInfo.Name == "Name").Select(a => a.TypedValue.Value).FirstOrDefault().ToString();
            }
            return s;
        }
...
Рейтинг: 0 / 0
02.10.2013, 11:56
    #38414057
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Это code first? Потому что в db first в edmx вроде нет этих атрибутов. Тогда не понятно, зачем эти атрибуты нужны в EF модели. Им там вообще не место.
...
Рейтинг: 0 / 0
02.10.2013, 11:57
    #38414060
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Andrey_VP,
автор PropertyInfo property = EFmodel.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.Name == EFpropertyName).FirstOrDefault();
А это как? Вы допускаете этим выражением что имена пропертей могут совпадать в типе?
...
Рейтинг: 0 / 0
02.10.2013, 12:11
    #38414090
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Andrey_VP,
авторPropertyInfo property = EFmodel.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.Name == EFpropertyName).FirstOrDefault();
if (property.IsDefined(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), true))
хороший финт, если проперть не найдена мы все равно заставим код выполняться - дальше искать в дефолтной атрибуты
...
Рейтинг: 0 / 0
02.10.2013, 12:15
    #38414098
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
МСУЭто code first? Потому что в db first в edmx вроде нет этих атрибутов. Тогда не понятно, зачем эти атрибуты нужны в EF модели. Им там вообще не место.

наверное хочет заюзать dto в качестве моделей для вью. нормальная практика, чо ))))
...
Рейтинг: 0 / 0
02.10.2013, 12:17
    #38414100
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Andrey_VP,
авторif (property.IsDefined
бедная программа, в нутрях она вытащила массив атрибутов, выкинула Any, и если есть -
хозяин опять полез вытаскивать эти атрибуты, не ужели не очевидно, что IsDefined лучше применять для принятия решения
от маркирован ли объект или нет, но не как не вытаскивать эту маркировку?
...
Рейтинг: 0 / 0
02.10.2013, 12:21
    #38414110
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Andrey_VP,
авторstring s="";
зачем нам на стеке это архитектурное излишество равно как и интренирование, в стринге есть статическое определение этой сущности
Короче, не зачет, переписывать все по новой..
...
Рейтинг: 0 / 0
02.10.2013, 12:26
    #38414120
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
hVosttнаверное хочет заюзать dto в качестве моделей для вью. нормальная практика, чо ))))
Хреновая практика, очень хреновая :)
...
Рейтинг: 0 / 0
02.10.2013, 12:32
    #38414129
Andrey_VP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Спасибо за критику, господа.
Написали бы и свои гениально верные решения для обучения новичков.
...
Рейтинг: 0 / 0
02.10.2013, 12:36
    #38414138
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Andrey_VP,
да нет проблем две минуты
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public static class Help
    {
        public static string GetNamePropertyDa(this PropertyInfo info )
        {
            if (info == null) return string.Empty;
            var ee=  info.GetCustomAttributes(typeof (DisplayAttribute), true);
            return ee.Any() ? ee.Cast<DisplayAttribute>().First().Name : string.Empty;
        }
    }
...
Рейтинг: 0 / 0
02.10.2013, 12:39
    #38414145
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Где-то в степиAndrey_VP,
да нет проблем две минуты
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public static class Help
    {
        public static string GetNamePropertyDa(this PropertyInfo info )
        {
            if (info == null) return string.Empty;
            var ee=  info.GetCustomAttributes(typeof (DisplayAttribute), true);
            return ee.Any() ? ee.Cast<DisplayAttribute>().First().Name : string.Empty;
        }
    }



Не правильно! Нельзя трогать свойство Name атрибута DisplayAttribute. Объяснить?
...
Рейтинг: 0 / 0
02.10.2013, 12:43
    #38414149
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Andrey_VPСпасибо за критику, господа.
Написали бы и свои гениально верные решения для обучения новичков.
http://ru.wikipedia.org/wiki/Model-View-ViewModel
http://ru.wikipedia.org/wiki/Model-View-Controller
http://ru.wikipedia.org/wiki/Model-View-Presenter

Этого хватит за глаза, чтобы писать правильный код, а не ковыряться в заднице прикладном коде рефлексией.
...
Рейтинг: 0 / 0
02.10.2013, 12:43
    #38414151
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
hVostt,
давай
...
Рейтинг: 0 / 0
02.10.2013, 12:45
    #38414156
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Andrey_VPСпасибо за критику, господа.
Написали бы и свои гениально верные решения для обучения новичков.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            using System.Reflection;

            ...
            var properties = from p in typeof(MyModelType).GetProperties()
                             where p.IsDefined(typeof(DisplayAttribute), false)
                             let display = p.GetCustomAttribute<DisplayAttribute>()
                             select new
                             {
                                 PropertyName = p.Name,
                                 DisplayName = display.GetName(),
                                 Description = display.GetDescription()
                             };



MyModelType - ваша модель

всё блин. в properties лежат имя проперти, его DisplayName, Description.. добавить по вкусу. можно кастануть в Dictionary и доставать по ключу.
...
Рейтинг: 0 / 0
02.10.2013, 12:48
    #38414158
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
Где-то в степиhVostt,
давай

в Name, вместо нужной локализованной строки может лежать наименование ключа локализованного ресурса.

необходимо всегда использовать метод GetName().
...
Рейтинг: 0 / 0
02.10.2013, 12:58
    #38414173
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
hVosttнеобходимо всегда использовать метод GetName().
Если ResourceType == null и в этом есть уверенность, то можно смело пользоваться Name. Но лучше прислушаться к рекомендациям MS.
...
Рейтинг: 0 / 0
02.10.2013, 13:09
    #38414190
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программно посмотреть DataAnnotations у свойства модели EF
hVosttГде-то в степиhVostt,
давай

в Name, вместо нужной локализованной строки может лежать наименование ключа локализованного ресурса.

необходимо всегда использовать метод GetName().
принимаю, согласен, посыпаю голову, не залез в справку, понадеялся на топикавтора "a => a.MemberInfo.Name == "Name""
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Программно посмотреть DataAnnotations у свойства модели EF / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]