【问题标题】:DBContext custom validationsDBContext 自定义验证
【发布时间】:2013-03-04 18:37:01
【问题描述】:

相对较新的 DBContext 并尝试在 DBContext 中编写自定义验证没有实现 IValidatableObject 接口或 ValidateEntity 覆盖。

例如 对于具有以下内容的部门实体: 姓名 交通# 盲人

这是一个sn-p的保存逻辑:

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。

【问题讨论】:

    标签: c# entity-framework validation dbcontext


    【解决方案1】:

    我建议将所有常见逻辑提取到您保存的同一个类中的 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;
    }
    

    然后,这样做将允许您在保存方法的开头调用此验证方法,然后仅在它通过后执行添加/附加。

    【讨论】:

    • 谢谢。我同意你的逻辑。有没有更好的方法来进行验证?因为我假设检查我的代码两次都在进行数据库调用。对?有什么办法可以避免吗?
    • 抱歉,我想不出一个。您想要验证以确保数据库中不存在这些值。为此,您要么必须实际访问数据库并询问,要么(更糟糕的是)在程序开始时缓存所有数据库值,然后稍后再访问(可怕的内存使用)。最好的办法是像这样进行验证。
    • .Any(),它是否也适用于更新?我假设在更新的情况下 if 条件将始终评估为 true,因为总会有一个具有给定名称或过境的部门。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2017-10-03
    • 2011-04-15
    • 2014-10-04
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多