0

私は2つのオブジェクトを持っています:-

LabTest
LabTestDetails

LabTestオブジェクトがゼロまたは多数のオブジェクトを持つことができる場所LabTestDetails。次のビジネスルールを実装する必要があります:-

LabTest オブジェクトが 1 つ以上の LabTestDetails オブジェクトに割り当てられている場合、ユーザーは LabTest オブジェクトを編集できません。

現在、LabTest オブジェクトで名前が付けられたヘルパー メソッドを実装してIsAlreadyAssignedいます (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 });
            }
        }

上記はほとんどの場合うまくいくかもしれませんが、ポスト アクション メソッドLabTestのチェック後にオブジェクトが別のユーザーによって labTestDetails オブジェクトに割り当てられた場合、上記のコードで ( * ) としてマークすると、ビジネス ロジックは次のようになります。壊れる。if ((c == null) || (c.IsAlreadyAssigned (id)))

LabTestdetail オブジェクトに割り当てられている場合、LabTest オブジェクトを常に編集できないように、アクション メソッドを実装する方法はありますか。

ブラジル

4

1 に答える 1

1

LabTestコメントで提案されているように、ストアド プロシージャを使用できますが、次のように、が割り当てられているかどうかを確認するサービス メソッドを作成することもできます。

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

ナビゲーション プロパティではなく、このメソッドを使用する利点は、データベースの現在の状態を反映することが保証されることです。

変更を保存する直前にもこのチェックを行う必要があることに注意してください。その場合でも、チェックを評価した直後、変更を保存する直前に挿入が発生する場合があります。

于 2012-04-24T20:56:05.123 に答える