2016-10-01 2 views
1

Как я могу добавить DbSet в класс dbContext, программно. [Entity Framework 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 внутри моего класса Context ...

+0

Вы не можете. DbSet - это свойства DbContext, и вы не можете расширять существующие объекты во время выполнения. Тем не менее, вы можете получить DbSet любых сопоставленных типов, используя свойство context.Set (). – DevilSuichiro

+0

так как я могу создать таблицу динамически, если я не могу создать dbset внутри db-контекста? ... у вас есть какое-то решение для этого? –

+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

Хорошее решение, но почему вы просто не создали MyDBContext с кодовым? – bubi

+1

Это решение лучше, ему не нужно количество кода и генерировать новый класс dbcontext для каждой создаваемой модели. @bubi –