gpt4 book ai didi

linq-to-sql - 返回 Entity Framework 中的普通对象以进行序列化

转载 作者:行者123 更新时间:2023-12-02 21:50:47 24 4
gpt4 key购买 nike

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

XML:

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<EntityKey>
<EntitySetName>Persons</EntitySetName>
<EntityContainerName>PersonEntities</EntityContainerName>
<EntityKeyValues>
<EntityKeyMember>
<Key>Id</Key>
<Value xsi:type="xsd:int">1</Value>
</EntityKeyMember>
</EntityKeyValues>
</EntityKey>
<Id>1</Id>
<Name>John</Name>
</Test>

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);

最佳答案

您可以在 Controller 中调整 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, PersonViewModel>(person);
return Json(dto);
}

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

关于linq-to-sql - 返回 Entity Framework 中的普通对象以进行序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/716770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com