У меня есть DbContext
с несколькими элементами следующего типа:
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; }
Все это где T: IdNamePairBase
, который имеет Id
и Name
только члены. Я отчаянно пытаюсь найти общий интерфейс для доступа к любому из этих членов, чтобы обобщить следующий код контроллера MVC3 в один контроллер:
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});
}
Как я могу решить мою проблему, что прямо сейчас мне нужен один контроллер для каждого из члены DbContext
, подобные приведенному выше, предназначены для DbSet
?
ЧАСТИЧНОЕ РЕШЕНИЕ: По аналогии с ответом ГертаАрнольда ниже, прежде чем я узнал обо всех _dbContext.Set
, которые он выделяет, я реализовал этот метод в своем классе контекста, чтобы получить наборы определенного типа:
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));
}