Добавление атрибутов [DataMember] [DataContract] в шаблон POCO Entity Framework

Мне нужна помощь в добавлении атрибутов шаблона POCO .tt Entity Framework для поддержки сериализации WCF и, если возможно, как добавить использование пространства имен для каждого объекта.

Спасибо.


person George Taskos    schedule 09.09.2010    source источник


Ответы (2)


Вам нужно открыть файл model1.tt (или как он называется в вашем проекте) и добавить несколько вещей.

Найдите эти строки кода (строка 34 в моем случае):

// Emit Entity Types
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
    fileManager.StartNewFile(entity.Name + ".cs");

Прямо перед этой строкой здесь:

<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>

вам нужно добавить атрибут [DataContract]:

[DataContract]
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>

к вашему шаблону.

Затем найдите эту строку кода:

<#=PropertyVirtualModifier(Accessibility.ForProperty(edmProperty))#> <#=code.Escape(edmProperty.TypeUsage)#> <#=code.Escape(edmProperty)#>

Перед этой строкой добавьте в шаблон атрибут [DataMember]:

[DataMember]
<#=PropertyVirtualModifier(Accessibility.ForProperty(edmProperty))#> <#=code.Escape(edmProperty.TypeUsage)#> <#=code.Escape(edmProperty)#>

Это добавит эти атрибуты для всех сущностей и всех свойств — возможно, это не то, что вам действительно нужно, но это только начало.

Кроме того: чтобы закончить, вы, вероятно, захотите взглянуть на функцию WriteHeader в своем шаблоне T4 и добавить оператор using System.Runtime.Serialization; в свой список использования:

using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Runtime.Serialization;  // add this to handle DataContract/DataMember
person marc_s    schedule 09.09.2010
comment
Спасибо, именно то, что мне нужно, я думаю, что могу начать понимать T4 каждую минуту, мне просто нужно быстро исправить некоторые исправления прямо сейчас. Пожалуйста, не могли бы вы помочь в том, где я могу добавить использование пространств имен для каждой сущности? - person George Taskos; 09.09.2010
comment
@gtas: обновил мой ответ - вам нужно включить дополнительное пространство имен System.Runtime.Serialization для обработки атрибутов DataContract/DataMember - person marc_s; 09.09.2010
comment
Были ли у вас проблемы с сериализацией? Особенно в отношении навигационных свойств и проблем с динамическим прокси-сервером, который не сериализуется. - person jamiebarrow; 28.07.2011
comment
В EF 4.1 все немного по-другому: для выборки свойства .tt необходимо добавить [DataMember] перед строкой, которая начинается с: ‹#=accessibility#› ‹#=type#› ‹#=name#› - person eka808; 06.09.2011
comment
Спасибо, мне это тоже помогло! - person RynoB; 12.04.2012
comment
Мне пришлось использовать [DataContract(IsReference = true)], потому что я получал в журналах такие вещи: ...contains cycles and cannot be serialized if reference tracking is disabled - person Landon Poch; 08.09.2012
comment
можно ли в любом случае отредактировать созданный шаблон кода DbContext, чтобы включить атрибут datacontract и datamember, чтобы я мог использовать его в модели данных в моей службе WCF (SOAP)? - person aDev; 17.09.2012
comment
Мне очень помог!. Однако для EF6 все было по-другому: добавьте [DataContract] над строкой № 27 и [DataMember] над строкой № 72. Также добавьте использование System.Runtime.Serialization; для использования блока. - person SamTech; 28.02.2014

В EF6.1 вам нужно отредактировать файл model1.tt и добавить тег между UsingDirectives и EntityClassOpening:

<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
//MY TAG:
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
person Fastorro    schedule 05.06.2014