当前位置:  开发笔记 > 前端 > 正文

返回实体框架中的普通对象以进行序列化

如何解决《返回实体框架中的普通对象以进行序列化》经验,为你挑选了2个好方法。

我一直在我的ASP.NET MVC应用程序中尝试Linq to Sql和EF.切换到EF后,我意识到我的XML/JSON序列化输出有额外的缺点.

XML:


  
    Persons
    PersonEntities
    
      
        Id
        1
      
    
  
  1
  John

JSON:

{"Id":1,"Name":"John","EntityState":2,"EntityKey"{"EntitySetName":"Persons","EntityContainerName":"PersonEntities","EntityKeyValues":[{"Key":"Id","Value":1}],"IsTemporary":false}}

相反,我只想我的输出:

{"Id":1, "Name":"John"}

我检索对象的EF查询是:

Tests.First(t => t.Id == testId);

Kris.. 7

您可以在控制器中塑造JSON结果,如下所示:

public JsonResult Person(int id)
{
  var person = PersonRepository.FindByID(id);
  var result = new { Id = person.Id, Name = person.Name };
  return Json(result);
}

这将限制序列化的DTO仅包含您想要的值.

编辑:作为评论问题的回答; 您可以创建一个更简单的PersonViewModel类(DTO),您可以将属性映射到.正如John Saunders在他的回答中提到的,Automapper是一种简化从EF Person实例复制属性值的好方法:

修改后的Action方法可能如下所示:

public JsonResult Person(int id)
{
  var person = PersonRepository.FindByID(id);
  var dto = Mapper.Map(person);
  return Json(dto);
}

我能想到的唯一其他选项是使用反射来修改Person实体上的DataMemberAttributes以抑制EntityKey属性.



1> Kris..:

您可以在控制器中塑造JSON结果,如下所示:

public JsonResult Person(int id)
{
  var person = PersonRepository.FindByID(id);
  var result = new { Id = person.Id, Name = person.Name };
  return Json(result);
}

这将限制序列化的DTO仅包含您想要的值.

编辑:作为评论问题的回答; 您可以创建一个更简单的PersonViewModel类(DTO),您可以将属性映射到.正如John Saunders在他的回答中提到的,Automapper是一种简化从EF Person实例复制属性值的好方法:

修改后的Action方法可能如下所示:

public JsonResult Person(int id)
{
  var person = PersonRepository.FindByID(id);
  var dto = Mapper.Map(person);
  return Json(dto);
}

我能想到的唯一其他选项是使用反射来修改Person实体上的DataMemberAttributes以抑制EntityKey属性.



2> aleemb..:

解决此问题的另一种方法是使用JavascriptSerializer的ScriptIgnore属性并为相关对象创建一个部分类,新建EntityKey,EntityState属性并向其添加ScriptIgnore属性:

public partial class Person
{
    [ScriptIgnore]
    public new System.Data.EntityKey EntityKey { get; set; }

    [ScriptIgnore]
    public new System.Data.EntityState EntityState { get; set; }
}

当Person类通过JavascriptSerializer序列化时,它将忽略这些属性.但是,这不实用,因为EF使用状态信息来跟踪对象,这会造成严重破坏.

如果有一种方法可以动态添加属性,则只需添加属性即可消除覆盖这些属性的需要[ScriptIgnore].但是,由于无法动态添加属性,因此该解决方案可能没那么有用.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有