如何在 C# 的简单存储库中实现更新操作

本文关键字:实现 更新 操作 存储 简单 | 更新日期: 2023-09-27 18:35:51

我的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中选择的实体相同,这不是存储库本身。

感谢您的阅读!

如何在 C# 的简单存储库中实现更新操作

最终,这应该归结为时空权衡。您建议在整个存储库中实现相等比较器和迭代,这样可以最大化运行时,但通过使用List<T>作为存储库使用的数据结构,占用的空间很小。在最坏的情况下,当您更新列表的最后一个元素时,您将需要遍历整个事物并对每个元素运行相等运算,直到它与最后一个元素匹配。这对于较小的存储库是可行的。

另一个非常常见的解决方案是覆盖存储库中T类型的GetHashCode,并使用HashSet<T>Dictionary<T, V>作为存储库中的数据结构。后者将最大限度地减少 O(1) 的时间,但为数据结构占用更多空间。对于更大的存储库来说,这可能是一个更好的解决方案,特别是如果每个类型的T对象都有一个属性,例如与之关联的GUID或数据库标识符,这是唯一的,因为这样你就有一个非常简单的哈希值。

根据存储库的确切用例,您可以为存储库考虑其他数据结构。例如,如果您尝试维护存储库中元素的顺序,其中一次只读取最高或最低元素,则 PriorityQueue 或堆可能适合您。如果您花时间考虑支持存储库的数据结构,则实现的其余部分应该自行解决。

不要将所有内容加载到内存中。试试这样。

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);
       }