2

DBContextは比較的新しく、 IValidatableObjectインターフェイスまたはValidateEntityオーバーライドを実装せずにDBContextでカスタム検証を書き込もうとしています。

例:次のような部門エンティティの場合:Name Trasit#BLID

保存ロジックのスニペットは次のとおりです。

public static Boolean saveDepartmentDetails(Department dept, out string errorMessage)
{
Boolean isSuccessful = false;
Int32 iRetVal = 0;
errorMessage = string.Empty;

using (OnlineFormsEntities context = new OnlineFormsEntities())
{
    if (dept != null)
    {
        if (dept.DepartmentID > 0)
        {
            //Todo: I know this is wrong.
            if (context.Departments.Where(d => d.DepartmentName.ToLower() == dept.DepartmentName.ToLower() && d.DepartmentID != dept.DepartmentID).Count() > 0)
            {
                errorMessage = "A Department with the given name already exists.";
                return false;
            }
            if (context.Departments.Where(d => d.Transit.ToLower() == dept.Transit.ToLower() && d.DepartmentID != dept.DepartmentID).Count() > 0)
            {
                errorMessage = "A Department with the given Transit # already exists.";
                return false;
            }

            context.Departments.Attach(dept);
            context.Entry(dept).State = EntityState.Modified;
        }
        else
        {
            if (context.Departments.Where(d => d.DepartmentName.ToLower() == dept.DepartmentName.ToLower()).Count() > 0)
            {
                errorMessage = "A Department with the given name already exists.";
                return false;
            }
            if (context.Departments.Where(d => d.Transit.ToLower() == dept.Transit.ToLower()).Count() > 0)
            {
                errorMessage = "A Department with the given Transit # already exists.";
                return false;
            }

            context.Departments.Add(dept);
        }

        try
        {
            iRetVal = context.SaveChanges();
        }
        catch (System.Data.OptimisticConcurrencyException opEx)
        {
            errorMessage = opEx.Message;
            ((IObjectContextAdapter)context).ObjectContext.Refresh(RefreshMode.ClientWins, dept);
            iRetVal = context.SaveChanges();
        }
        isSuccessful = (iRetVal > 0) ? true : false;
    }
}
return isSuccessful;
}

更新ロジックについてサポートが必要です。または、このSaveDepartmentDetailsをコーディングするためのより良い方法。

4

1 に答える 1

0

すべての一般的なロジックを、保存している同じクラスの Validation メソッドに引き出すことをお勧めします (つまり、値を返すメソッドbool: 合格の場合は True、そうでない場合は False です。エラー メッセージが表示される場合があります)。outパラメータとしても使用されています):

private bool ValidateDept(OnlineFormsEntities context, Department dept, out string errorMessage)
{
  errorMessage = string.empty;

  if (context.Departments.Any(d => d.DepartmentName.ToLower() == dept.DepartmentName.ToLower() && d.ID != dept.ID))
   {
     errorMessage = "A Department with the given name already exists.";
     return false;
   }
 if (context.Departments.Any(d => d.Transit.ToLower() == dept.Transit.ToLower() && d.ID != dept.ID))
   {
     errorMessage = "A Department with the given Transit # already exists.";
     return false;
  }
 return true;
}

これを行うと、save メソッドの先頭でこの検証メソッドを呼び出し、それが渡された後にのみ追加/添付を行うことができます。

于 2013-03-04T18:49:22.940 に答える