Мне нужна помощь в добавлении атрибутов шаблона POCO .tt Entity Framework для поддержки сериализации WCF и, если возможно, как добавить использование пространства имен для каждого объекта.
Спасибо.
Мне нужна помощь в добавлении атрибутов шаблона POCO .tt Entity Framework для поддержки сериализации WCF и, если возможно, как добавить использование пространства имен для каждого объекта.
Спасибо.
Вам нужно открыть файл 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
System.Runtime.Serialization
для обработки атрибутов DataContract/DataMember
- person marc_s; 09.09.2010
[DataContract(IsReference = true)]
, потому что я получал в журналах такие вещи: ...contains cycles and cannot be serialized if reference tracking is disabled
- person Landon Poch; 08.09.2012
[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)#>