0

我有一个关于在 ASP.NET MVC 中保存对象列表的问题。首先,我没有使用 EntityFramework 或 Nh 之类的 ORM 工具,只需使用 Ado.net

假设我有一个对象产品,我想通过 javascript 收集所有产品数据并一次调用批量更新产品列表。

我的问题是何时应该区分插入、更新或删除的项目?

  1. 一种策略是我在 DTO 对象和 javascript ViewModel 上都有一个枚举属性,当我在 viewModel 中添加一个项目时,我将此对象标记为要添加,如果我更改了一个项目,我将其标记为已更新。因此,当此请求执行时,我可以知道要插入或更新哪些项目。

    • 优点:在服务器端很容易,不需要从服务器端区分对象状态。
    • 缺点:如果我想将此操作发布到将由第三方调用的 webapi,则可能需要第三方用户来区分对象的状态。
  2. 区分服务器端的数据,只需给我一个对象列表,在服务器端,首先从数据库中检索当前数据,比较数据,然后检查要插入或更新的记录。

    • 优点:所有比较都是从服务器端完成的。
    • 缺点:性能问题
  3. 无论从客户端传递什么数据,只需删除当前数据并插入新数据

我希望有人能给我一个建议,处理这种情况的最佳做法是什么,我认为这很常见,但我找不到最佳解决方案。

4

2 回答 2

1

第三种策略适用于简单的情况,例如当您要更新采购订单项目时,订单不会有太多的 OrderLineItems。但是,您必须注意并发问题。

我认为您的第一个策略最适合一般情况。它也很容易实现。当您想将服务发布给第三方时,客户端通常必须遵循服务定义和要求。


更新

对于第一个策略:如果您不希望您的客户必须为他们的数据指定状态,那就为他们做。您可以将 SaveOrder 服务分成更小的服务:CreateOrder、UpdateOrder、DeleteOrder。

于 2013-02-28T04:27:26.553 回答
1

我已经看到选项 1,其中添加/删除/修改的项目在 javascript 数组中维护并回发到服务器。但由于某种原因,我不喜欢它可能是因为编写客户端代码来维护状态。

所以,我使用了第二个选项,感谢 LINQ 让我的任务更轻松。假设列表有一些唯一的 id,下面是伪代码。注意:新添加的项目应该具有唯一的随机 id,否则可能会将它们视为已经存在的项目。在我的情况下,它的 GUID,所以没有覆盖的机会。

var submittedIds = vmList.Select(a=>a.Id).ToList();
var dbIds = dbList.Select(d=>d.Id).ToList();
//Added items
var newIds = submittedIds.Except(dbIds).ToList();
//loop over newIds and construct list object to contain newly added items 

//Deleted items
var deletedIds = dbIds.Except(submittedIds).ToList();
//Modified items
var modifiedIds = dbIds.Intersect(submittedIds).ToList();//if the values don't change, update statement won't do any harm here

除非您正在处理大量列表,否则这种方法会提供合理的性能。

我认为第三种选择不好。例如:如果您计划在表上实施审计功能,它会给您错误的功能。如果插入一条新记录,则所有记录的条目都会被删除,然后插入一条记录,这是错误的,因为只插入了一条记录。

于 2013-02-28T04:34:25.027 回答