如何在服务器中应用在客户端中进行的更改,例如删除或修改实体

时间:2015-12-29 07:47:19

标签: 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",


    "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
}

例如,用户从服务器获取Model并通过使用knockout js对其实体进行一些更改(如更新,添加或删除链接),并将更改发送回服务器。

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

我知道如何插入新链接:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

  1. 向您的实体(链接)添加一个observable,例如state: ko.observable()addedunchangedmodifieddeleted 。删除实体时,不要将它们从数组中删除,而应将其标记为deleted。使用带有knockout的属性很容易隐藏实体,例如使用data-bind="visible: state()!='deleted'(如果使用计算机进行此检查,则更好),或使用计算机或使用类似{{3}的内容过滤链接数组过滤数组。

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

    < / LI>
  3. 与上一个类似:将链接列表发送到服务器,只需删除服务器中的所有链接并保存收到的链接。

  4. 如果客户端中的实体与EF DbContext中的实体类似,您可以使用功能极强的ko projections,它允许您自动跟踪客户端的更改,并发送他们回到服务器。实际上,你几乎可以将它用作客户端EF,并且在淘汰赛中表现得非常好。

  5. 注意:不允许您找到解决方案的主要问题是您希望使用Model作为从服务器发送数据和向服务器发送数据。你必须使用不同的东西。例如,在第一个解决方案中,您还需要在服务器大小上添加state属性,以反序列化并使用它。您可以使用一个全新的类,或者只是将属性添加到您的实体,但是使用EF属性忽略它,因为您不想将其保存在数据库中。在最后的解决方案中,一切都在幕后发生,所以你不需要手工完成。