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

C# 如何在C语言的简单存储库中实现更新操作#,c#,repository-pattern,crud,object-identity,C#,Repository Pattern,Crud,Object Identity,我的C#应用程序使用存储库模式,我非常怀疑如何实现CRUD操作的“更新”部分。具体地说,我不知道如何“告诉”存储库我要替换哪个对象(这样就可以在以后执行持久化) 我在控制台应用程序(作为示例编写)中有以下代码,该应用程序使用应用程序中的库: class Program { static void Main(string[] args) { var repo = new RepositorioPacientes(); var listapacientes

我的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)
,以便repo知道正在传回的实体与从
listapacientes
中选择的实体相同,而不是存储库本身


感谢阅读!

归根结底,这应该归结为时间-空间的权衡。您建议在整个存储库中实现相等比较器和迭代,这样可以最大限度地提高运行时间,但使用
列表作为存储库使用的数据结构,占用的空间很小。在最坏的情况下,更新最后一个元素,您将需要迭代整个元素,并对每个元素运行相等操作,直到它与最后一个元素匹配。这对于较小的存储库是可行的

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


<> P>还有其他的数据结构,可以根据存储库的具体用例考虑存储库。例如,如果您试图维护一个元素库中的元素,其中只有一个最高或最低元素一次获取,优先级队列或堆可能是您的。如果您花时间思考DA如果是一个支持存储库的结构,则实现的其余部分应该自行解决。

不要将所有内容都加载到内存中。尝试类似的方法

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

}
您可以使用此链接:

然后试试这个代码

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

我认为您对我的理解的主要贡献是“支持存储库的数据结构”。到目前为止,我甚至没有将其加载到内存中,因为
GetAll
方法只是返回集合,甚至没有将其缓存在repo本身中……顺便问一下,既然我计划在WPF中使用此repo和数据绑定,您认为公共的,
observateCollection
可以用作支持结构吗?或者更大胆地说,更简单地说让我的存储库继承自
ObservableCollection
并实现CRUD方法?应用程序相当简单。如果您的应用程序规模较小,那么立即在内存中支持它所使用的数据结构就无关紧要了。您应该使用快速开发和理解的方法,同时让代码保持抽象够了,你以后可以更改它。既然你建议使用存储库,我想你已经提取了足够多的代码来做这件事了。在这种情况下,
observateCollection
MSDN页面建议你按照你说的那样继承它,所以我觉得这是满足你需要的好方法。哦,如果你是我们正在处理内存紧张的问题,但是由于您的问题表明您更关心必须遍历整个集合,因此我假设您希望更好的运行时,而不是空间使用。