Javascript JSON仅序列化第一级

时间:2014-07-03 18:21:45

标签: c# javascript json angularjs entity-framework

我正在客户端上使用AngularJS构建应用程序,并在后端使用ASP.NET WebAPI / Entity Framework。

我需要确保存储或回滚完整的事务,而不是依赖纯粹的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}
    ]
}

现在,让我们说我改变Bobs LastName并希望保存它。我将我的UoW发送到服务器,在EF上下文中,我在我编辑的对象上执行以下操作(在此之前没有代码触摸obj):

databaseContext.Entry(obj).State = EntityState.Modified;

这给我一个错误:

  

附加类型为' MyApp.Model.Country'的实体失败,因为同一类型的另一个实体已具有相同的主键值。使用'附加'方法或将实体的状态设置为“未更改”#39;或者'修改'如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用'添加'方法或“添加”#39;实体状态跟踪图形,然后将非新实体的状态设置为“未更改”。或者'修改'酌情。

我的第一个想法是在将不需要的属性发送回服务器之前去除它们 - 所以在我上面的JSON中,我应该发回一个类似的结果,但是没有“国家/地区”。和动物'属性。我仍然想保留CountryID。

  1. 如果没有明确指定要删除的属性,这是否可行?
  2. 因为我遇到这个问题,我的方法是否存在概念上的错误?我应该处理这个服务器端吗?

1 个答案:

答案 0 :(得分:0)

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