繁体   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