【发布时间】:2011-04-10 08:07:05
【问题描述】:
我想要一些帮助,添加 POCO .tt 实体框架模板属性以支持 WCF 序列化,如果可能的话,如何为每个实体添加命名空间使用。
谢谢。
【问题讨论】:
标签: wcf c#-4.0 entity-framework-4 poco t4
我想要一些帮助,添加 POCO .tt 实体框架模板属性以支持 WCF 序列化,如果可能的话,如何为每个实体添加命名空间使用。
谢谢。
【问题讨论】:
标签: wcf c#-4.0 entity-framework-4 poco t4
您需要打开您的 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
【讨论】:
System.Runtime.Serialization 来处理 DataContract/DataMember 属性
[DataContract] 和在第 72 行上方添加 [DataMember]。还添加 using System.Runtime.Serialization; 用于使用块。
在 EF6.1 中你需要编辑 model1.tt 并在 UsingDirectives 和 EntityClassOpening 之间添加标签:
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
//MY TAG:
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
【讨论】: