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。

  1. 如果没有明确指定要删除哪些属性,这是可能的吗?
  2. 由于我面临这个问题,我的方法在概念上是否有问题?我应该处理这个服务器端吗?

Javascript JSON只序列化第一层

设法通过删除我的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很高兴,我节省了少量的带宽,不发送整个图。