Pro*_*ofK 7 .net c# entity-framework ef-code-first entity-framework-4.1
我有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; }
Run Code Online (Sandbox Code Playgroud)
所有这些都是where 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});
}
Run Code Online (Sandbox Code Playgroud)
我怎么能解决我的问题,现在我需要一个控制器为每个DbContext成员,如上面的那个致力于DbSet<Country> Countries?
部分解决方案:除了下面与GertArnold的答案类似之外,在我了解_dbContext.Set<T>他所提到的所有内容之前,我在我的上下文类中实现了这个方法来获取特定类型的集合:
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));
}
Run Code Online (Sandbox Code Playgroud)
通过使用可以进行一些概括
var dbSet = _dbContext.Set<T>
Run Code Online (Sandbox Code Playgroud)
并将大部分方法放在带有泛型类型参数的方法中.
但是,应该有一个开关来决定应该指定哪种类型以及要创建哪种类型,因为我认为类型是作为模型的属性提供的(是吗?).所以它可能不会看起来很优雅,但可能会更短,使用DRY-er代码.
| 归档时间: |
|
| 查看次数: |
13353 次 |
| 最近记录: |