2014-10-10 101 views
3

说我有以下DbSets我如何选择的DbContext正确DbSet基于表名

class Amimals : DbContext 
{ 
    public DbSet<Dog> Dogs { get; set; } 
    public DbSet<Cat> Cats { get; set; } 
} 

里面我定义的表中的每个DbSet像

class DogConfig : EntityTypeConfiguration 
{ 
    public DogConfig() 
    { 
     this.ToTable("DOG_TABLE"); 
     ... 
    } 
} 
每个EntityTypeConfiguration的的DbContext

现在,如果我有表名和DbContext,我如何获取并使用正确的DbSet?

void foo() 
{ 
    string tableName = this.GetTableName(); 
    using(Animals context = new Animals()) 
    { 
     /* Made up solution */ 
     DbSet animalContext = context.Where(c => c.TableName == tableName); 
     ... 
     /* Do something with DbSet */ 
     ... 
    } 
} 

回答

9

您可以通过的DbContext使用Type方法DbContext.Set(Type entityType)得到DbSet。所以如果你有模型类名称作为字符串,你应该做一些映射到实际的clr类型。

例如:

string tableName = "Cat"; 
var type = Assembly.GetExecutingAssembly() 
     .GetTypes() 
     .FirstOrDefault(t => t.Name == tableName); 

if(type != null) 
    DbSet catContext = context.Set(type); 

您也可以使用全大会限定名称Type.GetType(“...”)

从字符串类型如果将更加容易,如果你可以存储配置不知何故以通用的方式,并使用通用的context.Set<T>()方法。

+0

很好,这是返回EntityTypeConfiguration类。我需要使用DbSet。 有没有办法在上下文中获取DbSet的实例? – DobleA 2014-10-10 22:28:48

+1

是的,你可以。此代码工作正常并返回DbSet的实例。在我的示例中,'talbeName'必须与模型类名称匹配。请注意'tableName'等于“Cat”,所以结果将是DbSet 。好吧,'tableName'听起来有点不清楚,它应该是'C#模型类名称,它在DbContext的泛型DbSet中与此类型一起使用并且代表一些表名'。请分享您的不工作代码。 – 2014-10-11 06:46:45

+0

那么,如果我说'context.Cats.Select(c => c)'我尝试使用'AsQueryable()',但仍然不会这样做,我无法像调用Linq方法那样调用DbSet。 – DobleA 2014-10-13 14:21:40

0

另一种方法是以下工作对我罚款:

Type t = Type.GetType(Assembly.GetExecutingAssembly().GetName().Name + "." + "TableName"); 
DbSet dbset = dbcontext.Set(t);