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

15
我很乐意帮助您将POCO .tt Entity Framework模板属性添加到支持WCF序列化的内容中,并告诉您如何为每个实体添加命名空间。
谢谢。
2个回答

47

您需要打开您的 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)#>

这将为所有实体和属性添加这些属性 - 这可能不是你真正想要的,但这是一个起点。

另外: 最后,您可能想查看T4模板中的WriteHeader函数,并将using System.Runtime.Serialization;语句添加到您的using列表中:

using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Runtime.Serialization;  // add this to handle DataContract/DataMember

1
谢谢,这正是我所需要的,我想我可能会逐渐开始理解T4,但现在我只需要一些快速修复。请问您能否提供一些帮助,告诉我在每个实体中添加命名空间的位置? - George Taskos
你在序列化方面遇到了什么问题吗?特别是关于导航属性的问题,以及动态代理未被序列化的问题。 - jamiebarrow
1
使用EF 4.1时,对于.tt的属性获取有所不同,您必须在以下行的开始处添加[DataMember]: <#=accessibility#> <#=type#> <#=name#>。 - eka808
有没有办法编辑生成的DbContext代码模板,以包括DataContract和DataMember属性,以便我可以在我的WCF(SOAP)服务中使用数据模型? - aDev
5
帮了我很多!但是对于EF6来说有些不同,需要在第27行上方添加[DataContract],在第72行上方添加[DataMember]。同时,在代码块中添加using System.Runtime.Serialization; - SamTech
显示剩余2条评论

1
在EF6.1中,您需要编辑model1.tt文件,在UsingDirectives和EntityClassOpening之间添加标记:
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
//MY TAG:
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接