EF& Linq无法检索相关数据

时间:2015-11-11 18:02:00

标签: c# linq serialization linq-to-xml entity-framework-6

我有当前的实体类Timesheet

public class Timesheet
{
    #region Properties
    public int Id { get; set; }
    public DateTime TransactionDate { get; set; }
    public int ProjectId { get; set; }
    public int AccountId { get; set; }
    [MaxLength(50)]
    public string Supplier { get; set; }
    #endregion

    #region Navigation Properties
    [ForeignKey("ProjectId")]
    public virtual Project CurrentProject { get; set; }
    [ForeignKey("AccountId")]
    public virtual Account CurrentAccount { get; set; }
    #endregion
}

执行此简单查询时,

var query = db.Timesheets.AsQueryable();
var data = query;
return data;

我得到以下结果(注意 CurrentProject CurrentAccount ):

<Timesheet>
    <AccountId>33</AccountId>
    <CurrentAccount i:nil="true"/>
    <CurrentProject i:nil="true"/>
    <Id>1</Id>
    <ProjectId>1064</ProjectId>
    <Supplier>Test Supplier</Supplier>
    <TransactionDate>2016-02-27T00:00:00</TransactionDate>
</Timesheet>

但是,在尝试显式加载相关对象时,

var query = db.Timesheets.AsQueryable();
var data = query.Include(n => n.CurrentProject);
return data;

我收到序列化错误:

  

'ObjectContent 1'类型无法序列化内容类型'application / xml的响应主体;字符集= UTF-8'

     

<ExceptionMessage>输入数据合约名称为'Timesheet_B61B0CCFFB38C448231EBA3EF4D3D57C851AD2AE97FAA0BF8AA7F175D4C507D6'的'System.Data.Entity.DynamicProxies.Timesheet_B61B0CCFFB38C448231EBA3EF4D3D57C851AD2AE97FAA0BF8AA7F175D4C507D6':http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies'。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。</ExceptionMessage>

我使用LINQPad运行了类似的查询,并使用所有相关对象得到了正确的结果,所以我不知道这里有什么问题。

我在这里是一个n00b,可以真正使用你的帮助!

1 个答案:

答案 0 :(得分:0)

几乎可以肯定,由于Project的导航属性回到了Timesheet。

当序列化Timesheet时,CurrentProject属性也是如此。反过来,它引用了时间表,产生了循环引用。

在Project类上装饰Timesheet导航属性以防止它被序列化:[JsonIgnore]。如果你.Include()那么你也必须对Account类做同样的事情。