Comment généraliser l'accès à l'DbSet<TEntity> les membres d'une DbContext?

J'ai un DbContext avec plusieurs types de membres:

public DbSet<JobLevel> JobLevels { get; set; }
public DbSet<Country> Countries { get; set; }
public DbSet<Race> Races { get; set; }
public DbSet<Language> Languages { get; set; }
public DbSet<Title> Titles { get; set; }

Tous ces sont where T: IdNamePairBase, qui a Id et Name membres seulement. J'essaie désespérément de trouver une interface commune pour accéder à l'un de ces membres, de généraliser la suite de MVC3 contrôleur de code dans un contrôleur:

public ActionResult Edit(DropDownListModel model, Guid)
{
    var dbSet =  _dbContext.Countries;
    var newItems = model.Items.Where(i => i.IsNew && !i.IsDeleted).Select(i => new { i.Name });
    foreach (var item in newItems)
    {
        if (!string.IsNullOrWhiteSpace(item.Name))
        {
            var undead = ((IEnumerable<IdNamePairBase>)dbSet).FirstOrDefault(p => p.Name.ToLower() == item.Name.ToLower());
            if (undead != null)
            {
                //Assign new value to update to the new char. case if present.
                undead.Name = item.Name;
                undead.IsDeleted = false;
                _dbContext.SaveChanges();
                continue;
            }
            var newPair = new Country { Name = item.Name };
            dbSet.Add(newPair);
            _dbContext.SaveChanges();
        }
    }
    return RedirectToAction("Edit", new {listName = model.ListName});
}

Comment pourrais-je aller sur la résolution de mon problème que pour l'instant, j'ai besoin d'un contrôleur pour chaque DbContext membres, comme celle ci-dessus est dédié à DbSet<Country> Countries?

SOLUTION PARTIELLE: le Long des lignes semblables à GertArnold la réponse ci-dessous, avant que je savais à propos de la _dbContext.Set<T> tout ce qu'il souligne, j'ai mis en œuvre cette méthode sur ma classe de contexte pour obtenir des ensembles d'un type spécifique:

public IEnumerable<DbSet<T>> GetDbSetsByType<T>() where T : class
{
    //var flags = BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance;
    var props = GetType().GetProperties()
        .Where(p => p.PropertyType.IsGenericType && p.PropertyType.Name.StartsWith("DbSet"))
        .Where(p => p.PropertyType.GetGenericArguments().All(t => t == typeof(T)));
    return props.Select(p => (DbSet<T>)p.GetValue(this, null));
}
Une approche totalement différente dans un contexte différent, mais peut-être intéressant pour vous: stackoverflow.com/questions/9762808/...

OriginalL'auteur ProfK | 2012-03-21