Entity Framework / Base Repository class - Добавить проверку на наличие дубликатов - PullRequest
0 голосов
/ 24 мая 2018

В нашем приложении есть несколько классов репозитория с методами, подобными следующим:

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 голосов
/ 24 мая 2018

Ну, я делал такие вещи раньше.Я надеюсь, что смогу помочь.Что вы можете сделать, это построить выражение для условия в _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()));
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...