Запрос Entity DbSet с переменным типом объекта - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть метод с параметром ValidationContext.

Вот пример того, чего я хотел бы достичь.

Цель состоит в том, чтобы проверить, есть ли дубликаты вDbSet<Vehicule>, если это Vehicule, на DbSet<Color>, если это Color и т. Д.

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    MultiRetouchesEntities db = new MultiRetouchesEntities();
    Type testType = validationContext.ObjectInstance.GetType();
    switch (testType.Name)
    {
        case "Vehicule":
            Vehicule vehicule = (Vehicule)validationContext.ObjectInstance;

            bool validateName = db.Vehicule.Any(x => x.Name =(string)value);
            if (validateName == true)
            {
                return new ValidationResult("This vehicule already exists", new string[] { "Name" });
            }
        break;
        case "Color":
            Color vehicule = (Color)validationContext.ObjectInstance;
            //Do something with db.Color, for exemple
            db.Color.Add(Color);
            break;
    }
    return ValidationResult.Success;
}

Здесь я использую оператор switch, который работает, нотам самое чистое решение?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Для тех, кто интересуется, вот как я решил.

Главное - это использование System.Linq.Dynamic.

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    MultiRetouchesEntities db = new MultiRetouchesEntities();

    Type entityType = validationContext.ObjectInstance.GetType();
    string propertyName= validationContext.ObjectType.GetProperty(validationContext.MemberName).Name.ToLower();

    int nbOfEntities = db.Set(entityType).Where(propertyName + "=@0",((string)value).ToLower()).Count();

    return nbOfEntities == 0 ? ValidationResult.Success : new ValidationResult("Le nom choisi existe déjà !");
}
0 голосов
/ 21 сентября 2018

вы можете использовать вместо Polymorph If или switch case.

Создать базовый класс ModelValidBase для Vehicule и Color двух типов.

Передать параметрыв методе конструктора, который вы будете использовать в будущем.

  1. ValidationContext v validtionContext.
  2. object p параметр vaild.

существует метод abstract ValidationResult Dosomthing() для подкласса для реализации

public abstract class ModelValidBase {
    protected ValidationContext _validContext;
    protected object parameterValue;
    public ModelValidBase(ValidationContext v, object p)
    {
        _validContext = v;
        parameterValue = p;
    }
    public abstract ValidationResult Dosomthing();
}

VehiculeContext реализации ModelValidBase класса иoverride ValidationResult Dosomthing, сделайте свою логику в этом классе

public class VehiculeContext : ModelValidBase
{
    public VehiculeContext(ValidationContext v, object p) : base(v, p)
    {
    }

    public override ValidationResult Dosomthing()
    {
        MultiRetouchesEntities db = new MultiRetouchesEntities();
        Vehicule vehicule = (Vehicule)(_validContext.ObjectInstance) ;

        bool validateName = db.Vehicule.Any(x => x.Name == (string)parameterValue);
        if (validateName == true)
        {
            return new ValidationResult("This vehicule already exists", new string[] { "Name" });
        }

        return ValidationResult.Success;
    }
}

ColorContext Реализация ModelValidBase класса и override ValidationResult Dosomthing, сделайте свою логику в этом классе

public class ColorContext : ModelValidBase
{
    public ColorContext(ValidationContext v, object p) : base(v, p)
    {
    }

    public override ValidationResult Dosomthing()
    {
        Color vehicule = (Color)_validContext;
        //Do something with db.Color, for exemple
        db.Color.Add(Color);

        return ValidationResult.Success;
    }
}

В финалешаг создать dictionary<string, ModelValidBase> и зарегистрировать VehiculeContext и ColorContext в словаре.

вы можете получить экземпляр по строковому имени, которое может вместо if else или switch case control flow

public class MyCustomerAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        Dictionary<string, ModelValidBase> _registerTable = new Dictionary<string, ModelValidBase>();
        _registerTable.Add("Vehicule", new VehiculeContext(validationContext,value));
        _registerTable.Add("Color", new ColorContext(validationContext, value));
        Type testType = validationContext.ObjectInstance.GetType();

        ModelValidBase excuteValid;

        if (!_registerTable.TryGetValue(testType.Name, out excuteValid))
        {
            //return a result when you didn't get context from the register table.
        }

        return excuteValid.Dosomthing();
    }
}
...