2016-01-13 4 views
0

Я переопределяю метод ValidateEntity для проверки уникальной проверки, и я ударил камень преткновения.Получение свойства класса по имени

protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items) 
{ 
    var result = new DbEntityValidationResult(entityEntry, new List<DbValidationError>()); 

    if (entityEntry.Entity is ReferenceType && entityEntry.State == EntityState.Added) 
    { 
     var entity = entityEntry.Entity as ReferenceType; 

     var pluralService = PluralizationService.CreateService(CultureInfo.GetCultureInfo("en-gb")); 
     var pluralEntity = pluralService.Pluralize(entity.GetType().Name); 

     // I would like Courses to be replaced with the property name of pluralEntity 
     if (Courses.Where(x => x.Title == entity.Title).Count() > 0) 
     { 
      result.ValidationErrors.Add(new DbValidationError(nameof(entity.Title), nameof(entity.Title) + " must be unique.")); 
     } 
    } 

    if (result.ValidationErrors.Count > 0) 
    { 
     return result; 
    } 
    else 
    { 
     return base.ValidateEntity(entityEntry, items); 
    } 
} 

В моем классе SchoolContext у меня есть свойство DbSet<Course> Courses который является ReferenceType (обычай абстрактного типа класса).

Значение pluralEntity это курсы, но я хочу, чтобы положить в чем-то, если-заявление аналогично:

if (Property(pluralEntity).Where(x => x.Title == entity.Title).Count() > 0) 
{ 
    // validate 
} 

Есть ли способ сделать это?

Update Я получил это:

var prop = (DbSet<ReferenceType>) GetType().GetProperty(pluralEntity).GetValue(this, null); 

if (prop.Where(x => x.Title == entity.Title).Count() > 0) 
{ 
    result.ValidationErrors.Add(new DbValidationError(nameof(entity.Title), nameof(entity.Title) + " must be unique.")); 
} 

Но поскольку ReferenceType является абстрактным классом, он не может бросить его во время выполнения.

Я хотел бы сделать что-то вроде этого

var prop = (DbSet<typeof(entityEntry.Entity.GetType().Name)>) 

Но, конечно, это переменная и не может быть принят в качестве общего типа

+0

Итак, вы хотите, чтобы этот метод мог искать дубликаты в любом 'DbSet' для дубликатов в зависимости от типа проверяемого объекта? –

+0

Да, это то, что я пытаюсь сделать. –

+0

Вы всегда будете использовать 'Title' для проверки? –

ответ

0

Единственное, что я могу думать на момент записывает специальный метод проверки, используя шаблон репозитория.

Во-первыхи, создать интерфейс, который все ваши предприятия будут осуществлять

public interface IEntity 
{ 
    public string Title {get; set; } 
} 

Затем создайте хранилище:

public class Repository<TEntity> where TEntity: class, IEntity 
{ 
    private YourContext context = new YourContext(); 
    private DbSet<TEntity> AppDbSet; 

    public Repository() 
    { 
     AppDbSet = context.Set<TEntity>(); 
    } 

    //a couple of method to retrieve data... 
    public List<TEntity> GetAll() 
    { 
     return AppDbSet.ToList(); 
    } 

    public IEnumerable<TEntity> Find(Func<TEntity, bool> predicate) 
    { 
     return AppDbSet.Where<TEntity>(predicate); 
    } 

    public TEntity Single(Func<TEntity, bool> predicate) 
    { 
     return AppDbSet.FirstOrDefault(predicate); 
    } 

    //Lastly, implement a validation method 
    public bool IsValid(TEntity entity) 
    { 
     if (AppDbSet.SingleOrDefault(x => x.Title == entity.Title) != null) 
      return false; 
     else 
      return true; 
    } 
} 

использовать репозиторий следующим образом:

Repository<Course> courseRepository = new Repository<Course>(); 

Course course = new Course(); 
course.Title = "Boring course"; 

Console.WriteLine(courseRepository.IsValid(course)); 

Надеется, что это помогает ,

+0

Это работает очень хорошо, спасибо –

Смежные вопросы