为什么我的超级简单的ASP.NET Web API(mvc4)+实体框架5不起作用?

时间:2012-10-25 02:09:11

标签: asp.net-web-api entity-framework-5

我花了好几天才知道我工作中的问题,但没有运气。

  1. 我创建了新的MVC4 Web API项目。
  2. 使用我的数据库添加EF5(项目>添加> ADO.NET实体数据模型>从Azure SQL中的数据库创建)。
  3. 将两个表添加到edmx,如下所示。两个* .tt文件成功生成实体和模型类。
  4. enter image description here

    我可以看到断点(结果)正常显示查询结果。 但是json给出了异常流而没有错误消息。 (即,http://localhost:41813/api/sheet/157返回" 157"无法下载。一般来说," 157.json"已下载)

    enter image description here

    我将结果中的属性复制到我手工制作的POCO风格的课程中,并且有效。

    我的问题是什么?我不能使用生成的模型类通过Json发送数据。 我几乎没有发现问题,因为在结果断点之后没有错误消息和可用的调试步骤。

2 个答案:

答案 0 :(得分:6)

序列化失败的原因是你的导航属性 - 当序列化程序试图遍历对象图时,它们会导致循环依赖。

为了让你的简单样本发挥作用,你几乎无法解决它。

  1. Sheet
  2. 中删除导航属性 SheetDetail
  3. 使用导航属性 Sheet省略 ViewModel 类中的对象
  4. 使用JsonIgnoreAttribute创建元数据类,然后将其附加到具有部分类MetadataTypeAttribute
  5. 的实体

    在这里你可以找到第三个解决方案的样本(样本做了一些假设,因为我不知道你的确切数据类型):

    public class SheetDetailSerializationMetadata
    {
        [JsonIgnore]
        public Sheet Sheet { get; set; }
    }
    
    [MetadataType(typeof(SheetDetailSerializationMetadata))]
    public partial class SheetDetail
    { 
    }
    

答案 1 :(得分:0)

作为@danludwig的评论,http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization提供了有关我的问题的所有答案。

Global.asax 中添加以下代码可以解决问题。

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
Newtonsoft.Json.PreserveReferencesHandling.All;