从T4模板中的edmx读取DataMember属性

时间:2014-06-05 11:26:50

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

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

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

我试着阅读

edmProperty.TypeUsage.Facets

以及此对象的一些其他属性。我还在google上搜索并查看了t4模板上的一些sampleprojects。但没有运气。

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

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;}
}

1 个答案:

答案 0 :(得分:1)

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

在此之后,我们的edmx Property标签看起来与此类似:

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

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