2012-04-23 55 views
0

被分配到子對象,我有兩個目標: -我怎麼能防止編輯父對象,如果它已經在我的asp.net MVC Web應用程序

LabTest 
LabTestDetails 

LabTest對象可以有零個或多個LabTestDetails對象。 我需要實現以下業務規則: -

如果LabTest對象已分配給一個或多個LabTestDetails對象,則用戶應該無法編輯LabTest對象。在

public partial class LabTest 
    {  
public bool IsAlreadyAssigned(int id) 
      { 

       return (LabTestDetailss.Any(r2 => r2.LabTestID == id)); 

      }} 

然後,我添加了以下檢查 - :

目前,我已經實現了LABTEST對象命名IsAlreadyAssigned一個輔助方法(以檢查LABTEST對象已被分配給任何LabTestDetails對象)在Get & Post編輯操作方法: -

public ActionResult Edit(int id) 
    { 


     LabTest c = repository.GetLabTest (id); 

     if ((c == null) || (c.IsAlreadyAssigned (id))) 
     { 
      return View("Error"); 
     } 

     return View(c); 
    } 

    [HttpPost] 
    public ActionResult Edit(int id, FormCollection colletion) 
    { 

     LabTest c = repository.GetLabTest (id); 
     if ((c == null) || (c.IsAlreadyAssigned (id))) // ******* 
     { 
      return View("Error"); 
     } 
     try 
     { 
      if (TryUpdateModel(c)) 
      { 

       elearningrepository.Save(); 
       return RedirectToAction("Details", new { id = c.LabTestID }); 
      } 
     } 

以上可能正常工作在大多數的情況下,但如果LabTest對象只是指定給labTestDetails OBJ在if ((c == null) || (c.IsAlreadyAssigned (id)))檢查後的行動方法後,我將其標記爲(*)上的代碼,然後我的業務邏輯將被打破。

所以有沒有一種方法來實現我的動作方法,以便它將始終防止編輯LabTest對象,如果它已被分配給LabTestdetail對象。

BR

+0

如果您在幕後使用Linq to Sql或Entity Framework,那麼您可能可以通過併發檢查來完成此操作 – 2012-04-23 22:03:38

+0

我正在使用實體框架,但它不處理這種情況;因爲這種商業規則沒有實施,並且不能在數據庫級別實施......所以EF將無法檢測到這種安全事件。 – 2012-04-24 00:13:21

+0

你是說它不能在數據庫級別實現?你打算使用存儲的特效? – MisterJames 2012-04-24 04:07:46

回答

1

你可以使用一個存儲過程,如意見提出,但你也可以創建一個檢查一個LabTest是否被分配服務的方法,像

public bool LabTestIsAssigned(int labTestId) 
{ 
    using (var context = new YourContext()) 
    { 
     return context.LabTestDetails.Any(d => d.LabTestID == id); 
    } 
} 

使用此方法而不是導航屬性的好處是可以保證反映數據庫的當前狀態。

請注意,您必須在保存更改之前執行此檢查!即使這樣,在評估檢查之後並且在保存更改之前,插入可能會發生。

+0

這意味着使用服務方法不能保證100%該對象仍未分配!我對嗎? – 2012-04-24 23:12:38

+1

是的,那是事實。一個存儲過程,在那裏你可以使用鎖定,是唯一可能使其水密。或者,當您在一個事務中添加或刪除LabTestDetails時,您必須更新LabTest記錄(使用版本控制)。 – 2012-04-25 06:41:42

相關問題