【问题标题】:Adding [DataMember] [DataContract] attributes in Entity Framework POCO Template在实体框架 POCO 模板中添加 [DataMember] [DataContract] 属性
【发布时间】:2011-04-10 08:07:05
【问题描述】:

我想要一些帮助,添加 POCO .tt 实体框架模板属性以支持 WCF 序列化,如果可能的话,如何为每个实体添加命名空间使用。

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢你,正是我需要的,我想我可能会开始逐步理解 T4,我现在只需要快速修复一些问题。请您就我在每个实体上使用命名空间添加的位置提供一些帮助吗?
    • @gtas:更新了我的答案 - 您需要包含额外的命名空间 System.Runtime.Serialization 来处理 DataContract/DataMember 属性
    • 对于 EF 4.1,有点不同,对于 .tt 的属性获取,您必须在开头的行之前添加 [DataMember] :
    • 谢谢,这也帮助了我!
    • 帮了我很多!但是 EF6 完全不同,在第 27 行上方添加 [DataContract] 和在第 72 行上方添加 [DataMember]。还添加 using System.Runtime.Serialization; 用于使用块。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2011-04-19
      • 2013-11-26
      相关资源
      最近更新 更多