0

我有两个对象:-

LabTest
LabTestDetails

一个LabTest对象可以有零个或多个LabTestDetails对象。我需要实现以下业务规则:-

如果已将 LabTest 对象分配给一个或多个 LabTestDetails 对象,则用户应该无法编辑它。

目前我已经实现了一个名为IsAlreadyAssignedLabTest 对象的辅助方法(检查 LabTest 对象是否已分配给任何 LabTestDetails 对象):-

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

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

            }}

然后我在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 });
            }
        }

以上可能在大多数情况下都可以正常工作,但是如果在检查 post 操作方法LabTest后,对象刚刚被另一个用户分配给 labTestDetails 对象,if ((c == null) || (c.IsAlreadyAssigned (id)))我在上面的代码中将其标记为(*),那么我的业务逻辑将被打破。

那么有没有一种方法可以实现我的操作方法,这样如果它已分配给 LabTestdetail 对象,它将始终阻止编辑 LabTest 对象。

BR

4

1 回答 1

1

您可以按照评论中的建议使用存储过程,但您也可以创建一个服务方法来检查是否LabTest分配了 a ,例如

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

使用这种方法而不是使用导航属性的优点是可以保证反映数据库的当前状态。

请注意,您还必须在保存更改之前进行此检查!即便如此,在评估检查之后和保存更改之前可能会立即发生插入。

于 2012-04-24T20:56:05.123 回答