2016-10-01 89 views
1

如何以編程方式將DbSet添加到我的dbContext類中。 [實體框架CodeFirst,以編程方式將Dbset添加到DbContext

 public class MyDBContext : DbContext 
 
     { 
 
      
 
      public MyDBContext() : base("MyCon") 
 
      { 
 
       
 

 
       Database.SetInitializer<MyDBContext>(new CreateDatabaseIfNotExists<MyDBContext>()); 
 

 
      } 
 
     
 
//Do this part programatically: 
 
      public DbSet<Admin> Admins { get; set; }   
 
      public DbSet<MyXosh> MyProperty { get; set; } 
 

 
     }

] [1]

我想((C#代碼DOM)),當然我做了加我的模型類。但現在我有問題,我的上下文類中創建DbSet屬性...

+0

你不能。 DbSet是DbContext的屬性,並且不能在運行時擴展現有對象。但是,您可以使用上下文獲取任何映射類型的DbSet。Set ()屬性。 – DevilSuichiro

+0

那麼我怎麼能動態創建表,如果我不能創建dbset裏面的數據庫上下文?...你有任何解決方案嗎? –

+0

你可以完全沒有DbSet,覆蓋你的OnModelCreating並只映射你實際要使用的類型。 – DevilSuichiro

回答

1

是我沒有.. 此:https://romiller.com/2012/03/26/dynamically-building-a-model-with-code-first/

這:Create Table, Run Time using entity framework Code-First

的解決方案。無需直接與dbSets爭執。它只是通過做一些這樣的事情:

public class MyDBContext : DbContext 
{ 

    public MyDBContext() : base("MyCon") 
    { 
     Database.SetInitializer<MyDBContext>(new CreateDatabaseIfNotExists<MyDBContext>()); 
    } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     var entityMethod = typeof(DbModelBuilder).GetMethod("Entity"); 
     var theList = Assembly.GetExecutingAssembly().GetTypes() 
        .Where(t => t.Namespace == "FullDynamicWepApp.Data.Domins") 
        .ToList(); 
     foreach (var item in theList) 
     { 
      entityMethod.MakeGenericMethod(item) 
          .Invoke(modelBuilder, new object[] { }); 
     } 
     base.OnModelCreating(modelBuilder); 
    } 

} 
+0

很好的解決方案,但你爲什麼不用codedom創建MyDBContext? – bubi

+1

此解決方案更好,它不需要大量代碼併爲每個創建的模型生成新的dbcontext類。 @bubi –