Javascript JSON只序列化第一层
本文关键字:一层 JSON 序列化 Javascript | 更新日期: 2023-09-27 18:11:32
我正在客户端上使用AngularJS构建一个应用程序,而ASP。. NET WebAPI/实体框架。
我需要确保存储或回滚完整的事务,而不是依赖纯粹的RESTful服务。因此,我编写了一个JavaScript UnitOfWork实现,它跟踪我加载的每个对象,并根据类型分别存储它们。
我在持久化它们时遇到了一个问题。
假设我通过web API加载了以下对象:
{
FirstName: "Bob",
LastName: "Jensen",
Email: "test@example.com",
Country: { ID: 61, Name = "Zimbabwe"},
CountryID: 61,
Animals: [
{ Name: "Mittens", ID: 2},
{ Name: "Rex", ID: 1}
]
}
现在,假设我改变了bob的LastName并想保存它。我将我的UoW发送到服务器,并在EF上下文中,我对我编辑的对象执行以下操作(在此之前没有代码触及obj):
databaseContext.Entry(obj).State = EntityState.Modified;
这给了我一个这样的错误:
添加一个MyApp.Model类型的实体。"国家"失败,因为另一个相同类型的实体已经具有相同的主键值。当使用"Attach"方法或将实体的状态设置为"Unchanged"或"Modified"(如果图中的任何实体具有冲突的键值)时,可能会发生这种情况。这可能是因为一些实体是新的,还没有接收到数据库生成的键值。在这种情况下,使用"添加"方法或"添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"修改"。
我的第一个想法是在将其发送回服务器之前剥离不需要的属性-所以在上面的JSON中,我应该发送类似的结果,但没有'Country'和'Animals'属性。我还是想保留CountryID。
- 如果没有明确指定要删除哪些属性,这是可能的吗?
- 由于我面临这个问题,我的方法在概念上是否有问题?我应该处理这个服务器端吗?
设法通过删除我的JavaScript对象上的集合和对象引用来使其工作:
var clone = {};
for (prop in obj) {
if (typeof obj[prop] == "string" || typeof obj[prop] == "number" || typeof obj[prop] == "boolean") {
clone[prop] = obj[prop];
}
}
现在EF很高兴,我节省了少量的带宽,不发送整个图。