C# EF&Linq无法检索相关数据
我有当前实体类时间表: 执行此简单查询时C# EF&Linq无法检索相关数据,c#,linq,serialization,linq-to-xml,entity-framework-6,C#,Linq,Serialization,Linq To Xml,Entity Framework 6,我有当前实体类时间表: 执行此简单查询时 var query = db.Timesheets.AsQueryable(); var data = query; return data; 我从CurrentProject和CurrentAccount获得以下结果: 我收到一个序列化错误: “ObjectContent 1”类型未能序列化内容类型“application/xml”的响应正文;字符集=utf-8' 不应键入“System.Data.Entity.DynamicProxies.Time
var query = db.Timesheets.AsQueryable();
var data = query;
return data;
我从CurrentProject和CurrentAccount获得以下结果:
我收到一个序列化错误:
“ObjectContent 1”类型未能序列化内容类型“application/xml”的响应正文;字符集=utf-8'
不应键入“System.Data.Entity.DynamicProxies.Timesheet_B61B0CCFFB38C448231EBA3EF4D3D57C851AD2AE97FAA0BF8AA7F175D4C507D6”和“Timesheet_B61B0CCFFB38C448231EBA3EF4D3D57C851AD2AE97FAA0BF8AA7F175D4C507D6”。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORALALZER的已知类型列表中。p>
我使用LINQPad运行了一个类似的查询,得到了所有相关对象的正确结果,所以我不知道这里出了什么问题
我是这里的n00b,真的需要你的帮助 这几乎可以肯定是由于从项目返回时间表的导航属性 序列化时间表时,CurrentProject属性也是如此。它反过来引用时间表,从而产生循环引用
修饰项目类上的时间表导航属性,以防止其序列化:[JsonIgnore]。如果需要,您必须对Account类执行相同的操作。也包括它。您是在WCF还是Web API中执行此操作的?错误与序列化有关,而不是EF@PraveenPaulose正在通过Web API检索/返回数据。您检索到的数据很好。获取数据后序列化它时遇到问题。@RobertMcKee如何解决序列化问题,以便使用客户端应用程序能够遍历返回的数据?最简单的方法是独立于数据模型创建一个视图模型,并使用LINQ选择该视图模型,然后序列化该视图模型。然后,您可以将所需的任何和所有序列化内容放入其中,并删除虚拟导航属性,这通常是一个难点,因为它们是循环的。通过在数据模型上放置正确的属性,您可能可以重用该数据模型,但我自己不确定是哪些属性。您可以尝试这篇文章来提供帮助:@StevenMorgan我创建了一个DTO,只返回所需的数据。这似乎一时奏效,但突然又犯了同样的错误。有趣的是,如果我将其作为列表而不是IQueryable返回,它就会工作。您认为这仍然与循环引用有关吗?您查询的db上下文实例是针对局部变量还是控制器类的字段?如果它是一个局部变量,则在操作完成时它将超出范围,因此当序列化程序尝试序列化对象时,延迟的数据库调用将失败。
var query = db.Timesheets.AsQueryable();
var data = query;
return data;
<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;