1

我的 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 文件替换为另一个具有更新数据的 XML 文件。

不过,我对此并不担心。我无法弄清楚的是如何实现repo.Update(entity),以便 repo 知道被传回的这个实体与从中选择的实体相同listapacientes,而不是存储库本身。

谢谢阅读!

4

3 回答 3

1

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

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

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

于 2013-10-16T21:09:43.957 回答
1

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

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

}
于 2013-10-16T22:25:43.907 回答
0

您可以使用此链接: 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);
       }
于 2014-07-29T15:34:26.303 回答