Добавьте [IgnoreDataMemeber] к определенным свойствам в созданном разделяемом классе


У меня есть класс Entity Framework POCO, который генерируется шаблоном T4.

Я планирую использовать сгенерированный класс в качестве контракта данных. Однако у него есть несколько свойств, которые не обязательно должны быть в контракте. Например, у меня есть свойство под названием AddressId. Это внешний ключ к адресной таблице. Поскольку фактический адрес прикреплен к объекту, я не хочу, чтобы AddressId был виден клиенту.

Я мог бы изменить шаблон T4, но я бы предпочел нет.

Я видел этот пост , который показал, как использовать MetadataType для добавления атрибутов к существующим свойствам в частичных классах. Вот пример, который они привели:

[MetadataType(typeof(Dinner_Validation))] 
public partial class Dinner {} 

public class Dinner_Validation 
{ 
   [Required] 
   public string Title { get; set; } 
}

Но я попробовал это для моего класса (используя [IgnoreDataMember]), и это не работает (AddressId по-прежнему отображается).

Как я могу скрыть это свойство без необходимости создавать целый новый класс для копирования всех моих данных?

1 4

1 ответ:

MetadataType работает только с аннотациями данных. Он не работает с атрибутами сериализации. Атрибуты сериализации должны быть размещены непосредственно на свойствах в сущности, поэтому, если вы хотите использовать шаблон T4 для создания класса, вы должны добавить логику для создания этих атрибутов непосредственно в шаблон.

Правка:

Если вы хотите построить логику для генерации специальных атрибутов, вам нужно каким-то образом сообщить шаблону T4, какие свойства должны быть отмечены этим атрибутом. Вы можете либо жестко Закодируйте такую информацию в шаблон T4 или вы можете поместить эту информацию в файл EDMX. EDMX-файл поддерживает пользовательские элементы данных в своей XML-структуре. Эти пользовательские XML-элементы могут быть использованы в шаблоне T4 для некоторой дополнительной логики. Единственная проблема заключается в том, что конструктор не поддерживает это - вы должны добавить пользовательские элементы непосредственно в EDMX, открытый как XML.

Это целое называется структурными аннотациями. Некоторые примеры с обратной обработкой (модификация базы данных generation) можно найти в Мой другой ответ (также проверьте тему MSDN, связанную в вопросе). Существует также целый проект расширения , который, возможно, позволяет добавлять новые расширения вместе с поддержкой конструктора. Я думаю, что вы также можете прочитать об этих настройках в книге Entity Framework 4 in Action.