实体框架/基础存储库类 - 添加重复检查

时间:2018-05-24 18:32:58

标签: c# sql-server entity-framework

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

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列的名称。我不确定如何在更新方法中假设实体实体以通用方式编写这样的代码。

1 个答案:

答案 0 :(得分:2)

我以前做过这样的事情。我希望我能提供帮助。你可以做的是为 _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()));
            }
        }