Чтение атрибута DataMember из edmx в шаблоне T4

У меня есть приложение, которое имеет часть на стороне сервера и часть на стороне клиента. Серверная часть реализована с помощью WebApi2 и EF6 и использует Json И Protobuf в качестве сериализаторов. Вот почему я использую [DataMember] в качестве атрибута в свойствах моих моделей. Здесь мне нужно установить порядок в атрибуте [DataMember (Order = number)] из-за сериализатора Protobuf.

Из моих серверных моделей (codefirst) я создаю файл edmx, который содержит информацию о моделях. На стороне клиента я генерирую эти модели с помощью шаблона t4, который использует файл edmx. Перед тем, как использовать Protobuf, я просто поместил атрибут DataMember поверх каждого свойства в шаблоне t4, который работал нормально. Но теперь я должен использовать тот же порядок, что и на сервере, чтобы он по-прежнему работал с Protobuf. Это означает, что мне нужно прочитать атрибут DataMember в edmx и найти значение Order. Но я просто не могу прочитать атрибут.

Я пытался прочитать

edmProperty.TypeUsage.Facets

и некоторые другие свойства этого объекта. Я также искал в Google и просмотрел несколько примеров проектов по шаблонам t4. Но не повезло.

Итак, как я могу прочитать порядок атрибута?

MyServerModel
{
[DataMember(Order=1)] //this number of the order is what I'm looking for
MyProperty{get;set;}
}

Теперь используйте магию T4 и сгенерируйте подписчиков с помощью файла edmx.

MyClientModel
{
[DataMember(Order=1)] //I want to generate this Attribute with the t4 template from
                      //the edmx file
MyProperty{get;set;}
}

person Oliver Müller    schedule 05.06.2014    source источник


Ответы (1)


Атрибут DataMember не является частью файла edmx, потому что каждый член является атрибутом DataMember. И в результате информация о заказе теряется. Мы решили эту проблему следующим образом: Сначала мы нормально генерируем файл edmx. После этого мы вручную разбираем его и ищем записи EntityType. Затем мы загружаем Type с отражением из сборки, в которой находятся первые модели кода. Анализируйте CustomAttributes, чтобы найти DateMemberAttribute, где мы можем прочитать Order. Получив эту информацию, мы можем записать ее в файл edmx, либо поместив его в тег документации (не так элегантно), либо добавив его в тег Property / NavigationProperty в качестве пользовательской аннотации.

После этого наши теги свойств edmx будут выглядеть примерно так:

<Property Name="PropertyName" Type="Guid" xmlns:d2p8:DataMemberOrder="5" xmlns:d2p8="http://www.yourcompany.com/customAnnotation" />

В сценарии шаблона t4 вам нужно снова проанализировать файл edmx для получения этой информации, и вы можете написать аннотацию DataMember с порядком.

person Sjoerd222888    schedule 13.06.2014