Backpointer属性的代码优先数据注释

时间:2013-12-22 04:06:35

标签: ef-code-first data-annotations code-first

我正在使用Code First。我有一个Topic类和一个投票类。主题有投票。

public class Topic
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<Vote> Votes { get; set; }
}

投票类回到主题,所以我可以在代码中获得给定投票的主题。

public class Vote
{
    public Guid Id { get; set; }
    public bool IsUp { get; set; }
    public DateTime WhenVoted { get; set; }
    public Topic Topic { get; set; }
}

当我查询var topics = context.Topics.Include("Votes");时,我得到一个堆栈溢出,但是如果我从投票中删除对Topic的引用,它会正常加载。我相信我可以添加一个数据注释来表明这些注释表示相同的关系。如果是这样的话,有人会指出我正确的方向吗?

调用堆栈反复出现这种情况,这似乎表明序列化程序试图以递归方式呈现递归关系。所以也许告诉投票对象不要序列化Topic属性是正确的答案,但如果有数据注释答案,我想知道它是什么。

System.Runtime.Serialization.dll!System.Runtime.Serialization.ClassDataContract.WriteXmlValue(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.Runtime.Serialization.XmlObjectSerializerWriteContext context)  Unknown
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.RuntimeTypeHandle declaredTypeHandle)    Unknown
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.RuntimeTypeHandle declaredTypeHandle)   Unknown
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle) Unknown
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle)    Unknown

1 个答案:

答案 0 :(得分:0)

这是一个措辞严厉的问题,因为我错误地假设我的问题可以通过数据注释来解决。我的实际问题的答案是使用InverseProperty数据注释来创建后指针引用(A具有B的集合,B具有A的父属性)。然而,这并没有解决问题,因为我在序列化一个在代码示例中具有循环引用的完整对象模型。为了解决这个问题,我沿着设置我的模型的路径来强制使用DataContract,DataMember和ReferenceType属性进行正确的序列化以结束循环引用,虽然这有效,但我必须这样做的事实是清楚的指示我正在序列化不适合序列化的东西。相反,我创建了一个专门用于序列化的模型,将我的域映射到那个,并使用默认的json / xml序列化程序对其进行序列化,所有事情都只是在hunky dory中完成。