在Entity Framework POCO模板中添加[DataMember] [DataContract]属性

Geo*_*kos 15 wcf t4 poco entity-framework-4 c#-4.0

我想帮助添加POCO .tt实体框架模板属性以支持WCF序列化,以及是否可能如何将命名空间使用添加到每个实体.

谢谢.

mar*_*c_s 47

您需要打开model1.tt文件(或项目中调用的任何文件),并添加一些内容.

找到这些代码行(在我的例子中,第34行):

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

就在这一行之前:

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

你需要添加[DataContract]属性:

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

到你的模板.

接下来,找到这行代码:

<#=PropertyVirtualModifier(Accessibility.ForProperty(edmProperty))#> <#=code.Escape(edmProperty.TypeUsage)#> <#=code.Escape(edmProperty)#>
Run Code Online (Sandbox Code Playgroud)

在该行之前,将[DataMember]属性添加到模板中:

[DataMember]
<#=PropertyVirtualModifier(Accessibility.ForProperty(edmProperty))#> <#=code.Escape(edmProperty.TypeUsage)#> <#=code.Escape(edmProperty)#>
Run Code Online (Sandbox Code Playgroud)

这将为所有实体和所有属性添加这些属性 - 这可能不是您真正想要的,但它是一个开始.

另外:要完成,您可能想要查看WriteHeaderT4模板中的函数,并将该using System.Runtime.Serialization;语句添加到您的使用列表中:

using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Runtime.Serialization;  // add this to handle DataContract/DataMember
Run Code Online (Sandbox Code Playgroud)

  • 帮助了我很多!然而,它与EF6完全不同,在第27行上方添加`[DataContract]`,在第72行上添加`[DataMember]`.还使用`System.Runtime.Serialization;`添加块来使用. (5认同)