【问题标题】:Read DataMember Attribute from edmx in T4 Template从 T4 模板中的 edmx 读取 DataMember 属性
【发布时间】:2014-06-05 11:26:50
【问题描述】:

我有一个应用程序,它有一个服务器端部分和一个客户端部分。服务器端部分使用 WebApi2 和 EF6 实现,并使用 Json 和 Protobuf 作为序列化程序。这就是为什么我使用 [DataMember] 作为模型属性的属性。这里我需要将订单放入属性 [DataMember(Order = number)] 因为 Protobuf 序列化器。

从我的服务器端模型(codefirst)中,我生成了一个包含模型信息的 edmx 文件。在客户端,我使用 edmx 文件的 t4 模板生成这些模型。在我使用 Protobuf 之前,我只是将 DataMember 属性放在 t4 模板中的每个属性的顶部,效果很好。但是现在我必须使用与服务器上相同的订单,以便它仍然可以与 Protobuf 一起使用。这意味着我必须读取 edmx 中的 DataMember 属性并找到 Order 值。但我就是无法读取属性。

我试图阅读

edmProperty.TypeUsage.Facets

以及此对象的其他一些属性。我还在谷歌上搜索并查看了一些关于 t4 模板的示例项目。但没有运气。

那么如何读取属性的顺序呢?

MyServerModel
{
[DataMember(Order=1)] //this number of the order is what I'm looking for
MyProperty{get;set;}
}

现在使用 T4 的魔力并在 edmx 文件的帮助下生成以下内容。

MyClientModel
{
[DataMember(Order=1)] //I want to generate this Attribute with the t4 template from
                      //the edmx file
MyProperty{get;set;}
}

【问题讨论】:

    标签: attributes ef-code-first t4 protobuf-net datamember


    【解决方案1】:

    DataMember 属性不是 edmx 文件的一部分,因为每个成员都是 DataMember 属性。因此,订单信息丢失。 我们通过以下方式解决了这个问题:首先我们正常生成edmx文件。之后我们手动解析它并查找 EntityType 条目。然后我们从代码优先模型所在的程序集中加载带有反射的 Type。解析 CustomAttributes 以找到可以读取 Order 的 DateMemberAttribute。获得这些信息后,我们可以将其写入 edmx 文件,方法是把它放在文档标记中(不是那么优雅),或者将其添加到 Property/NavigationProperty 标记作为自定义注释。

    在这之后,我们的 edmx 属性标签看起来像这样:

    <Property Name="PropertyName" Type="Guid" xmlns:d2p8:DataMemberOrder="5" xmlns:d2p8="http://www.yourcompany.com/customAnnotation" />
    

    在 t4 模板脚本中,您必须再次解析 edmx 文件以获取此信息,并且可以按顺序编写 DataMember 注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多