C# WebApi 2和EF 6.1序列化失败
我对WebApi2和EF 6.1有问题(代码优先) 我有2个模型(主细节) 但是如果我执行C# WebApi 2和EF 6.1序列化失败,c#,entity-framework,asp.net-web-api2,entity-framework-6.1,C#,Entity Framework,Asp.net Web Api2,Entity Framework 6.1,我对WebApi2和EF 6.1有问题(代码优先) 我有2个模型(主细节) 但是如果我执行api/Master,我得到的错误消息是: {"Message":"An error has occurred.", "ExceptionMessage":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.", "E
api/Master
,我得到的错误消息是:
{"Message":"An error has occurred.",
"ExceptionMessage":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json;
charset=utf-8'.",
"ExceptionType":"System.InvalidOperationException","StackTrace":null,
"InnerException":{
"Message":"An error has occurred.",
"ExceptionMessage":"Error getting value from 'Details' on
'System.Data.Entity.DynamicProxies.Master_6110B4795BCBF52E3140C9F99EB1E28BF43BA97EB02A532B9C89FD1996CE11E9'.",
"ExceptionType":"Newtonsoft.Json.JsonSerializationException",
"StackTrace":"
at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues
(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter ...
我正在WebApiConfig.cs中强制使用JSON响应
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// Remove default XML handler
var matches = config.Formatters
.Where(f => f.SupportedMediaTypes
.Where(m => m.MediaType.ToString() == "application/xml" ||
m.MediaType.ToString() == "text/xml")
.Count() > 0)
.ToList();
foreach (var match in matches)
config.Formatters.Remove(match);
重要信息:如果我使用EF 6.0(删除索引属性和其他不支持的属性),这很好。所以我很困惑
提前谢谢
附言:我对C#(还有WebApi和EF)真的很陌生
编辑:根据建议,只需通过
IList
更改IQueryable
,并返回db.Masters.ToList()
,即可正常工作!但是,如果脚手架以这种方式生成IQueryable,为什么IQueryable会失败呢?为什么IQueryable使用EF 6.0而不是6.1?谢谢 您确定在关系的两侧都需要ForeignKey
属性吗?不,我尝试了使用和不使用该属性,但出现了相同的错误。(我检查,生成的结构是相同的)如果您返回db.Masters.ToList()
来强制实现,我更改了签名,这就行了!但是,你知道为什么IQueryable失败了吗??脚手架以这种方式生成,序列化延迟加载的实体似乎是在处理上下文或类似的事情之后完成的。无论如何,我想知道为什么它能与旧版本一起工作,因为这是一个常见的问题和常见的解决方法。
{"Detailss":[{"ID":1,"MasterID":1,"Desc":"test"}],"ID":1,"UserID":1,"TenantID":1}
{"Message":"An error has occurred.",
"ExceptionMessage":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json;
charset=utf-8'.",
"ExceptionType":"System.InvalidOperationException","StackTrace":null,
"InnerException":{
"Message":"An error has occurred.",
"ExceptionMessage":"Error getting value from 'Details' on
'System.Data.Entity.DynamicProxies.Master_6110B4795BCBF52E3140C9F99EB1E28BF43BA97EB02A532B9C89FD1996CE11E9'.",
"ExceptionType":"Newtonsoft.Json.JsonSerializationException",
"StackTrace":"
at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues
(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter ...
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// Remove default XML handler
var matches = config.Formatters
.Where(f => f.SupportedMediaTypes
.Where(m => m.MediaType.ToString() == "application/xml" ||
m.MediaType.ToString() == "text/xml")
.Count() > 0)
.ToList();
foreach (var match in matches)
config.Formatters.Remove(match);