2013-02-28 77 views
0

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

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

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

  1. 一个策略是,我有DTO对象和枚举属性 还对JavaScript的视图模型,当我添加项目到 视图模型,标志着我这个对象添加,如果我改变一个项目,我 标记为更新。所以当这个请求发生时,我可以通过 知道要插入或更新哪些项目。

    • 优点:它很容易在服务器端,不需要区分服务器端的对象状态。
    • 缺点:如果我想将此动作发布到将由第三方调用的webapi,那么可能需要第三方用户 区分对象的状态。
  2. 从服务器端区分数据,只要给我对象的名单,在服务器端,首先从数据库retrive目前的数据,对数据进行比较,然后检查要插入或更新该记录。

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

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

+1

我们在这里谈论多少数据? – 2013-02-28 04:23:52

+0

它的依赖项,例如Order with Order LineItems,可能是订单中的10-20行项目 – Sean 2013-02-28 04:26:14

+0

似乎如果您有大量数据,请将其发送到服务器端并执行所有操作。如果相对较小,请在客户端将对象标记为容易操作(更接近变更源)。我的2cp。 – 2013-02-28 04:29:49

回答

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 

这种方法给出了合理的性能,除非你正在处理巨大的列表。

我觉得第三个选项不好。例如:如果你打算在你的表上实现审计功能,它会给你错误的功能。如果插入了一条新记录,则会将所有记录的条目删除,然后插入一条记录,因为只插入一条记录。

1

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

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


更新

对于第一个策略:如果你不希望你的客户必须为他们的数据指定的地位做什么,然后为他们做。您可以将SaveOrder服务分成更小的服务:CreateOrder,UpdateOrder,DeleteOrder。

+0

雅,我同意但我面临的主要问题就像我说的,如果我想使它作为一个公共API,需要由第三方,OrderService.SaveOrder(订单)使用;那么我可能需要告诉第三方,请首先区分你的数据,并注明线条状态(更新或插入),这不是很友好..... – Sean 2013-02-28 04:35:07

+0

我更新了答案 – phnkha 2013-02-28 04:44:26

+0

ya,Order Object是一个graphy对象有一个OrderLineItems的nevigate列表,甚至分成更小的服务,当updateorder时,我们仍然需要知道订单LineItem的状态,除非我们将服务分开到UpdateOrderLineItem createorderlineItem ect ...你的意思是? – Sean 2013-02-28 05:43:27