Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
Asp.net 如何在服务器中应用客户端中所做的更改,如删除或修改实体_Asp.net_Json_Entity Framework_Knockout.js - Fatal编程技术网

Asp.net 如何在服务器中应用客户端中所做的更改,如删除或修改实体

Asp.net 如何在服务器中应用客户端中所做的更改,如删除或修改实体,asp.net,json,entity-framework,knockout.js,Asp.net,Json,Entity Framework,Knockout.js,我不知道如何从EF中的相关表中删除元素 测试Json数据: { "$id": "1", "Number": "000100029304", "Title": "Test Title", "Status": "Ready", "StatusDate": null, "Author": null, "UpdatedDate": "2012-12-12T12:12:12", "Comments": "test comment",

我不知道如何从EF中的相关表中删除元素

测试Json数据:

{
    "$id": "1",
    "Number": "000100029304",
    "Title": "Test Title",
    "Status": "Ready",
    "StatusDate": null,
    "Author": null,
    "UpdatedDate": "2012-12-12T12:12:12",
    "Comments": "test comment",


    "Links": [
      {
          "$id": "4",
          "DocumentId": 1234,
          "Name": "Some file1.xls",
          "Path": "\\\\mycomp\\folder\\Some file1.xls",
          "Type": 0,
          "Document": {
              "$ref": "1"
          },
          "ID": 200
      },
      {
          "$id": "5",
          "DocumentId": 1234,
          "Name": "Some file2.xls",
          "Path": "\\\\mycomp\\folder\\Some file2.xls",
          "Type": 0,
          "Document": {
              "$ref": "1"
          },
          "ID": 201
      },
    ],
    "ID": 1234
}
例如,用户从服务器获取一个
模型
,并通过使用knockout js对其实体进行一些更改(如更新、添加或删除链接),然后将更改发送回服务器

在服务器端,接收到的数据被反序列化为
模型
,并尝试应用更改

我知道如何插入新链接:

if (mylink.ID == 0) {context.Entry(mylink).State = EntityState.Added;}
else {context.Entry(mylink).State = EntityState.Modified;}

但是我找不到方法来删除客户端中删除的链接。我该怎么做?

您使用了正确的技术:附加到
DbContext
并更改实体状态

您唯一的问题是没有跟踪已删除的实体并将其发送回服务器。有多个选项可用于删除(或更新)服务器中已更改的实体:

  • 向实体(链接)添加一个可观察对象,例如
    状态:ko.observable()
    ,可以
    添加
    未更改
    修改
    ,或
    删除
    。删除实体时,不要将其从数组中删除,而是将其标记为
    已删除
    。通过knockout可以很容易地隐藏使用此属性的实体,例如使用
    data bind=“visible:state()!=“deleted”
    (如果使用computed来执行此检查,效果会更好),或者使用computed或类似的方法来过滤数组

  • 将链接列表发送回服务器,将其与数据库中的链接进行比较,并根据比较结果,通过删除或更改链接来应用相应的更改

  • 与前一个类似:将链接列表发送到服务器,只需删除服务器中的所有链接并保存收到的链接

  • 如果客户端中的实体与EF
    DbContext
    中的实体相似,则可以使用功能极其强大的工具,自动跟踪客户端中的更改,并将其发送回服务器。事实上,您可以将其几乎用作客户端EF,并且与knockout配合得非常好

  • 注意:不允许您找到解决方案的主要问题是,您希望使用
    模型作为从服务器发送数据和向服务器发送数据的方式。您必须使用不同的方式。例如,在第一个解决方案中,您还需要在服务器大小上添加
    state
    属性,以反序列化并使用它。您可以使用ole新类,或者简单地将属性添加到实体中,但使用EF属性忽略它,因为您不想将其保存在DB中。在上一个解决方案中,一切都发生在幕后,因此不需要手动操作