【问题标题】:Entity Framework / Base Repository class - Add check for duplicates实体框架/基础存储库类 - 添加重复检查
【发布时间】:2018-05-24 18:32:58
【问题描述】:

我们的应用程序中有一些存储库类,其方法如下:

public override void Add(Template template)
    {
        CheckDuplicateDescription(template);
        base.Add(template);
    }

    public override void Update(Template template)
    {
        CheckDuplicateDescription(template);
        base.Update(template);
    }

    private void CheckDuplicateDescription(Template template)
    {
        if( _dbSet.Any(x => x.Descrip.Equals(template.Descrip.Trim()) && x.TemplateId != template.TemplateId))
        {
            throw new DuplicatePropertyException("Description", 
                string.Format(Messages.alreadyExistsWithValue, template.Descrip.Trim()));
        }
    }

我试图弄清楚是否有办法使这个方法成为通用方法并在基础存储库类中实现(所以我们可能可以提供一个 bool 属性来告诉我们需要验证,也许还有要检查的列和 Pk 列的名称)。我不确定如何在更新方法中假设实体实体以通用方式编写这样的代码。

【问题讨论】:

  • 您不应该为流程控制和可以通过其他方式(返回值等)处理的情况抛出异常。 softwareengineering.stackexchange.com/questions/189222/…
  • 我将阅读第一个答案中提到的文章,但现在更改它将是一个巨大的重写工作,因为它已经在我们的应用程序中以这种方式处理(服务器例外-side 代码通过 web 应用程序中的 toastr 处理)。目前,我正在考虑将通用逻辑的那部分设为通用。
  • 您可以引入service layer 进行验证。此外,如果它基于 Web(MVC?),您可以最大化客户端验证以确保异常最小化。
  • 它是使用 angularJs 作为前端的 EF/ASP.NET MVC 应用程序。我写了一篇关于从前端使用服务器端验证的文章,您可能会觉得这很有趣 - 我将阅读您稍后参考的两篇文章。 social.technet.microsoft.com/wiki/contents/articles/…

标签: c# sql-server entity-framework


【解决方案1】:

嗯,我以前做过这样的事情。我希望我能帮忙。您可以做的是为 _dbSet.Any

中的条件构建一个表达式

类似这样的:

 public Expression<Func<T,bool>> GetCondition(string nameProperty, string text)
        {
            var i = Expression.Parameter(typeof(T), "i");
            var prop = Expression.Property(i, nameProperty);
            var value = Expression.Constant(text);

            MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
            var containsMethodExp = Expression.Call(prop, method, value);
            var lambda = Expression.Lambda<Func<T, bool>>(containsMethodExp, i);

            return lambda;
        }

那么你可以这样使用它:

private void CheckDuplicateDescription(T template)
        {
            var propDescription = GetPropertyNameDescription();//asuming you have the name of the Description property
            var value = GetValueDescription(template, propDescription);
            var condition = GetCondition(propDescription, value);

            if (_dbSet.Any(condition))
            {
                throw new DuplicatePropertyException("Description",
                    string.Format(Messages.alreadyExistsWithValue, template.Descrip.Trim()));
            }
        }

【讨论】:

  • 我想出了一种方法来使其或多或少通用。我还实现了一个新的 angularJs 指令,该指令使用异步验证器执行此类逻辑。我对其进行了测试,它工作正常,尽管有一些小问题需要处理。我还没有时间仔细阅读史蒂夫给我的所有链接,希望能在接下来的几天内完成。非常感谢你们俩的贡献。
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2012-10-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多