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

时间:2010-09-09 15:39:17

标签: wcf c#-4.0 entity-framework-4 poco t4

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

谢谢。

2 个答案:

答案 0 :(得分: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 System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Runtime.Serialization;  // add this to handle DataContract/DataMember

答案 1 :(得分:1)

在EF6.1中,你需要编辑model1.tt并在UsingDirectives和EntityClassOpening之间添加标签:

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