2014-10-10 24 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);