0

Entity Framework 已经从我的数据模型(使用模板)生成了一组 POCO 类,Entities.tt它们可以正常工作 - 但是因为它们具有循环引用(Airplane类具有 的属性 public virtual List<License> Licenses,并且每个License类都有互惠的Airplane属性)它们不会为我的 Web API 请求序列化为 XML。

[DataContract]如果我用和属性注释 POCO 类,[DataMember]那么一切正常 - 但如果类由模板重新生成,这些更改就会丢失 - 也就是任何时候对 edmx 进行更改。

#region POCO classes generated by the EF T4 template
[DataContract] // manually added and LOST if template regenerates this class
public partial class Airplane
{
    [DataMethod] // also LOST if regenerated    
    public int AirplaneId { get; set; }
    ...
    public List<Certification> Certifications{ get; set; }
}

public partial class Certification
{
    public int CertificationId { get; set; }
    public string CertificationAuthority { get; set; }
    public Airplane Airplane { get; set; }
}
#endregion

我已经尝试创建一个“伙伴”public partial class Airplane并对其进行注释,但是您不能两次声明相同的属性 - 所以我更进一步,Airplane用 a注释伙伴[MetadataType(typeof(Airplane_Metadata))],然后注释元数据类 - 据我所知这是它们存在的全部原因。

[MetadataType(typeof(Airplane_metadata))]
[DataContract] // <-- This actually works, but I can't add [DataMethod]s here
public partial class Airplane{}

public partial class Airplane_metadata
{
    [DataMethod] // NONE of the [Data...] tags are recognized by the serializer
    public int AirplaneId { get; set; }
    ...
}

它不起作用。序列化程序没有从 MetadataType 类中读取[DataMember]or[DataContract]注释。

我已经在网上冲浪了几个小时,但我还没有找到解决方案。Olav 和 Stephen 评论说我应该使用 DTO……但是如果我只需要重新编写它们,那么让 T4 模板生成 POCO 有什么意义呢?

任何帮助将不胜感激。

EDIT1::为清晰起见进行重大返工。

4

1 回答 1

0

我知道你说元数据的东西对你不起作用,但这对我有用......

将所有内容放在一个单独的文件中(例如 Airplane_partial.cs)。正如您所说,如果您必须更新实体,您将丢失对 EF 文件的所有更改。

在 Airplane_partial.cs...

public class AirplaneMetaData
{
    [DataMember()]
    public virtual DataType propertyName;
}

[MetadataType(typeof(AirplaneMetaData))]
public partial class Airplane
{
    // blank partial class
}

您还可以阅读这篇密集的 Microsoft 文章,看看它是否可以帮助您...

http://msdn.microsoft.com/en-us/library/vstudio/ee789839%28v=vs.100%29.aspx

于 2013-11-01T15:37:06.970 回答