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