簡體   English   中英

如何在C#中的簡單存儲庫中實現更新操作

[英]How to implement Update operation in simple repository in C#

我的C#應用​​程序使用存儲庫模式,對於如何實現CRUD操作的“更新”部分,我有一個可怕的疑問。 具體來說,我不知道如何“告訴”我要替換的對象(這樣持久性可以在后面進行)。

我在使用該應用程序庫的控制台應用程序(僅作為示例編寫)中具有以下代碼:

class Program
{
    static void Main(string[] args) {

        var repo = new RepositorioPacientes();

        var listapacientes = repo.GetAll();

        // Choosing an element by index
        // (should be done via clicking on a WPF ListView or DataGrid)
        var editando = listapacientes[0];  

        editando.Nome = "Novo Helton Moraes";

        repo.Update(editando);

    }

}

問題是:我應該如何告訴存儲庫必須更新哪個元素? 我是否應該使用相等比較器遍歷整個存儲庫以查找元素?

注意:此存儲庫使用XML序列化封裝數據訪問,每個實體一個文件,我的實體(在此示例中為Paciente類型)具有[Serializable]屬性。 也就是說,“更新”操作最終將通過Serialize方法將給定實體的XML文件替換為具有更新數據的另一個實體。

不過,我對此並不擔心。 我無法弄清楚的是如何實現repo.Update(entity)以便存儲庫知道該傳遞回的實體與從listapacientes選擇的實體相同,而不是存儲庫本身。

謝謝閱讀!

最終,這應該歸結為時空權衡。 您建議在整個存儲庫中實現相等比較器並進行迭代,這可以最大化運行時間,但通過使用List<T>作為存儲庫使用的數據結構,可以使用很少的空間。 在最壞的情況下,當您更新列表的最后一個元素時,您將需要遍歷整個事物,並對每個元素運行相等操作,直到與最后一個元素匹配為止。 對於較小的存儲庫,這是可行的。

另一個非常常見的解決方案是重寫存儲庫中T類型的GetHashCode ,並使用HashSet<T>Dictionary<T, V>作為存儲庫中的數據結構。 后者將使O(1)的時間最小化,但會為數據結構占用更多空間。 對於更大的存儲庫,這可能是一個更好的解決方案,尤其是如果每個T型對象都具有一個屬性,例如與之關聯的GUID或數據庫標識符是唯一的,因為這樣您就具有非常簡單的哈希值。

您可以根據存儲庫的確切用例為存儲庫考慮其他數據結構。 例如,如果您嘗試維護一次僅獲取最高或最低元素的存儲庫中的元素順序,則PriorityQueue或Heap可能適合您。 如果您花時間考慮支持存儲庫的數據結構,那么其余的實現應該可以解決。

不要將所有內容加載到內存中。 嘗試這樣的事情。

class Program
{
    static void Main(string[] args) {

    var repo = new RepositorioPacientes();

    var editando = repo.SingleOrDefault(p => p.Id == 1);

    editando.Nome = "Novo Helton Moraes";

    repo.Update(editando);
  }

}

您可以使用以下鏈接: http : //www.codeproject.com/Articles/644605/CRUD-Operations-Using-the-Repository-Pattern-in-MV

並嘗試此代碼

    public ActionResult Edit(int id)
        {
    Book book = _bookRepository.GetBookByID(id);
    return View(book);
    }  
     [HttpPost]
    public ActionResult Edit(Book book)
    {
      try
       {
         if (ModelState.IsValid)
          {
           _bookRepository.UpdateBook(book);
           _bookRepository.Save();
           return RedirectToAction("Index");
          } 
         }
          catch (DataException)
          {               
           ModelState.AddModelError("", "Unable to save changes. Try again, " + 
           "and if the problem persists see your system administrator.");
        }
            return View(book);
       }

暫無
暫無

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

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