我不知道如何从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;}
但我找不到删除客户端中删除的链接的方法。我该怎么办?
答案 0 :(得分:1)
您正在使用正确的技术:附加到DbContext
并更改实体状态。
您唯一的问题是您没有跟踪已删除的实体并将其发送回服务器。有多个选项可以删除(或更新)服务器中已更改的实体:
向您的实体(链接)添加一个observable,例如state: ko.observable()
,added
,unchanged
,modified
或deleted
。删除实体时,不要将它们从数组中删除,而应将其标记为deleted
。使用带有knockout的属性很容易隐藏实体,例如使用data-bind="visible: state()!='deleted'
(如果使用计算机进行此检查,则更好),或使用计算机或使用类似{{3}的内容过滤链接数组过滤数组。
将链接列表发送回服务器,将其与数据库中的链接进行比较,并根据比较结果删除或更改相应的更改。
< / LI>与上一个类似:将链接列表发送到服务器,只需删除服务器中的所有链接并保存收到的链接。
如果客户端中的实体与EF DbContext
中的实体类似,您可以使用功能极强的ko projections,它允许您自动跟踪客户端的更改,并发送他们回到服务器。实际上,你几乎可以将它用作客户端EF,并且在淘汰赛中表现得非常好。
注意:不允许您找到解决方案的主要问题是您希望使用Model
作为从服务器发送数据和向服务器发送数据。你必须使用不同的东西。例如,在第一个解决方案中,您还需要在服务器大小上添加state
属性,以反序列化并使用它。您可以使用一个全新的类,或者只是将属性添加到您的实体,但是使用EF属性忽略它,因为您不想将其保存在数据库中。在最后的解决方案中,一切都在幕后发生,所以你不需要手工完成。