簡體   English   中英

在ASP.NET MVC中保存對象列表

[英]Save a List of object in ASP.NET MVC

我有一個關於在ASP.NET MVC中保存對象列表的問題。 首先我不使用EntityFramework或Nh像ORM工具,只需使用Ado.net

假設我有一個對象產品,我想通過javascript收集所有產品數據,並在一次調用中批量更新產品列表。

我的問題是我何時應該區分插入,更新或刪除的項目?

  1. 一個策略是我在DTO對象上以及javascript ViewModel上有一個枚舉屬性,當我在viewModel中添加一個項目時,我將此對象標記為要添加,如果我更改了一個Item,我將其標記為已更新。 因此,當此請求進入操作時,我可以知道要插入或更新的項目。

    • 優點:在服務器端很容易,不需要將對象狀態與服務器端區分開來。
    • 缺點:如果我想將此操作發布到將由第三方調用的webapi,則可能需要第三方用戶來區分對象的狀態。
  2. 區分數據與服務器端,只需給我一個對象列表,在服務器端,首先從數據庫中檢索當前數據,比較數據,然后檢查要插入或更新的記錄。

    • 專業人士:所有比較都是從服務器端完成的。
    • 缺點:proformance問題
  3. 從客戶端傳遞的數據,只需刪除當前數據並插入新數據

我希望有人可以給我一個建議,處理這種情況的最佳做法是什么,我認為這很常見,但我找不到最佳解決方案。

第三種策略適用於簡單的情況,例如,當您想要更新采購訂單項時,訂單不會有太多的OrderLineItems。 但是,您必須注意並發問題。

我認為你的第一個策略最適合一般情況。 它也很容易實現。 如果要將服務發布到第三方,通常客戶端必須遵循服務定義和要求。


更新

對於第一個策略:如果您不希望客戶端必須為其數據指定狀態,請為它們執行此操作。 您可以將SaveOrder服務分成較小的服務:CreateOrder,UpdateOrder,DeleteOrder。

我看過選項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

除非您處理大量列表,否則此方法可提供合理的性能。

我認為第三種選擇並不好。 例如:如果您計划在表上實現審計功能,則會給您錯誤的功能。 如果插入了新記錄,則所有記錄的條目都將被刪除,然后插入一個錯誤,因為只插入了一個記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM