[英]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.