Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Javascript JSON仅序列化第一级_C#_Javascript_Json_Angularjs_Entity Framework - Fatal编程技术网

C# Javascript JSON仅序列化第一级

C# Javascript JSON仅序列化第一级,c#,javascript,json,angularjs,entity-framework,C#,Javascript,Json,Angularjs,Entity Framework,我在客户端使用AngularJS构建应用程序,在后端使用ASP.NET WebAPI/实体框架 我需要确保存储或回滚完整的事务,而不是依赖纯粹的RESTful服务。因此,我编写了一个JavaScript UnitOfWork实现,它跟踪我加载的每个对象,并按类型分别存储它们 我坚持的时候遇到了一个问题 假设我通过web API加载了以下对象: { FirstName: "Bob", LastName: "Jensen", Email: "test@example.com"

我在客户端使用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}
    ]
}
现在,假设我更改了Bobs的姓氏并想保存它。我将我的UoW发送到服务器,在EF上下文中,我对我编辑的对象执行以下操作(在此之前没有代码接触obj):

这给了我一个类似这样的错误:

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

我的第一个想法是在将不需要的属性发送回服务器之前去掉它们——因此在我上面的JSON中,我应该将类似的结果发送回服务器,但不包含“国家”和“动物”属性。我仍然想保留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很高兴,我通过不发送整个图表节省了一小部分带宽。

    我打赌你的上下文的寿命太长了。嗯。。这其实是一个有趣的观点,我甚至没有考虑过。它存储在我的ASP.NET控制器的专用字段中。我必须承认,我没有考虑过控制器实例化的频率,只是假设每个请求实例化一次。我想我弄错了,明天再调查。谢谢尽管如此,我还是不希望为我要发送的每个工作单元序列化整个对象图。@GertArnold:我选中了,没有-我的控制器在每个请求上都被实例化,所以我的内容只对一个查询/操作有效。是的,这是MVC中的默认行为。但不知怎的,这个实体在你显示的行之前就被连接了。你能给我看一下周围的代码吗?你是怎么拿到obj的?我在某个地方看到,有一些方法可以从数据库中获取它,这些方法已经将它标记为已修改,因此您只需更新数据,而不必触及状态
    var clone = {};
    for (prop in obj) {
        if (typeof obj[prop] == "string" || typeof obj[prop] == "number" || typeof obj[prop] == "boolean") {
            clone[prop] = obj[prop];
        }
    }