2016-10-01 6 views
1

Comment puis-je ajouter DbSet à ma classe dbContext, par programmation. [Entity Framework CodeFirst, Ajouter Dbset à DbContext, par programme

 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]

je veux ajouter mes classes de modèle par ((code C#-DOM)) et bien sûr je l'ai fait. mais maintenant j'ai un problème avec la création de propriétés DbSet dans ma classe ... Contexte

+0

Vous ne pouvez pas. Les DbSet sont des propriétés de DbContext et vous ne pouvez pas développer des objets existants lors de l'exécution. Toutefois, vous pouvez obtenir le DbSet de tous les types mappés en utilisant la propriété context.Set (). – DevilSuichiro

+0

alors comment puis-je créer une table dynamiquement si je ne peux pas créer dbset dans le contexte db? ... avez-vous une solution pour cela? –

+0

vous pouvez aller sans DbSet entièrement, remplacer votre OnModelCreating et mapper uniquement les types que vous allez réellement utiliser. – DevilSuichiro

Répondre

1

oui je l'ai fait .. ceci:! https://romiller.com/2012/03/26/dynamically-building-a-model-with-code-first/

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

sont la solution. pas besoin de contester avec dbSets directement. cela fonctionne juste en faisant quelque chose comme ça:

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

Belle solution, mais pourquoi ne pas simplement créer MyDBContext avec codedom? – bubi

+1

cette solution est meilleure, elle n'a pas besoin de quantité de code et génère une nouvelle classe dbcontext pour chaque création de modèle. @bubi –