0

我在CMS中有一個基本的CRUD,使用EF,它首先使用數據庫完成,而刪除功能只是刪除數據庫中的記錄。爲了安全起見改變mvc3中的c#delete功能

以下是刪除控制器代碼:

public ActionResult Delete(int id) 
    { 
     Database_Table database_table = db.Database_Table.Find(id); 
     return View(database_table); 
    } 


    [HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id) 
    {    
     Database_Table database_table = db.Database_Table.Find(id); 
     db.Database_Table.Remove(database_table); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     db.Dispose(); 
     base.Dispose(disposing); 
    } 
} 

現在從客戶的視角點安全的原因,而不是真正從數據庫中刪除表中的條目,我只是想改變的值數據庫,即'已刪除',從'N'到'Y',然後我將其隱藏,然後通過自定義查詢不會顯示值爲'Y'的條目。如果這是有道理的。我的問題是如何改變這個代碼不刪除,但只是改變一個值。

我覺得它看起來是這樣的:

[HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id) 
    { 
     if (ModelState.IsValid) 
     { 

     Database_Name database_name = db.Database_Name.Find(id); 
     db.Entry(database_name).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
     } 
      return View(database_table); 
    } 

但我不確定,其中約定義它只有一個值,該值將被修改,在這種情況下,「已刪除」值。也許還應該說它應該只返回到視圖的值爲'N'的條目

+0

您是否正在使用實體框架進行數據訪問? – Liam

+0

是的我首先使用實體​​框架,數據庫。 – Bohdi

+0

我對EF有些生疏,我已經將它重新標記爲EF,但哪個可能​​會讓您獲得更好的結果。 – Liam

回答

0

試試這個代碼。我建議您將這些樣的代碼在不同的圖層移動到一個方法(你可以創建一個新的類有這個方法存在並從您的控制器動作/你想要的任何地方調用它。

Database_Name database_name = db.Database_Name.Find(id); 

database_name.Deleted="Y"; 
db.Database_Name.Attach(database_name); 
db.Entry(database_name).State = EntityState.Modified; 
try 
{   
    db.SaveChanges(); 
} 
catch (DbUpdateConcurrencyException ex) 
{ 
    ex.Entries.Single().Reload(); 
    context.SaveChanges();   
} 
catch (Exception ex2) 
{ 
    //some error. Log it 
} 
+0

謝謝,現在嘗試實現它,看看它是如何工作的。你我永恆的救世主。 – Bohdi

0

這應該是用例爲conditional mapping條件映射將所有查詢自動過濾已刪除的項目:

  • 你的LINQ查詢
  • 預先加載
  • 延遲加載

沒有其他可靠的方法來過濾從已加載的已加載數據和延遲加載的數據中刪除的軟記錄。

但條件映射也有其缺點:因爲它已經用於條件映射(你將永遠無法用這個模型來查詢已刪除的記錄)

  • Deleted財產不能成爲實體的一部分
  • 刪除操作必須是mapped to stored procedure(或自定義SQL但需要在EDMX手動更改),將進行軟刪除你,因爲你沒有訪問Deleted財產代碼
  • 爲了使這個全功能的需要給我們e EDMX,因爲代碼首先不支持存儲過程映射尚未