Добавление атрибутов [DataMember] [DataContract] в шаблон POCO Entity Framework - PullRequest
15 голосов
/ 09 сентября 2010

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

Спасибо.

Ответы [ 2 ]

47 голосов
/ 09 сентября 2010

Вам нужно открыть файл 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
1 голос
/ 05 июня 2014

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

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