2017-10-13 7 views
0

Je n'arrive pas à comprendre pourquoi mes initialisateurs ne fonctionnent pas. J'utilise EF Code First pour créer une base de données et je veux aussi utiliser l'approche d'initialisation pour remplir la base de données avec des valeurs par défaut lors de la création de la base de données. Mais chaque fois que j'essaie, ma base de données crée mais les initialiseurs ne fonctionnent pas et il n'y a pas de données dans les tables qui sont celles que je veux initialiser avec des valeurs par défaut. Est-ce que je manque quelque chose? Si j'ai tort, alors quelle est la bonne façon d'utiliser les initialiseurs.

Remarque: Je ne souhaite pas utiliser Configuration.c pour créer une base de données, je souhaite utiliser mes initialiseurs personnalisés.

DataContext.cs
Initialisation de la base de données avec le code EF Premier

namespace WebApplication1.Data.Context 
{ 
    public class DataContext : DbContext 
    { 
     public DataContext() : base("name=MyDB") 
     { 
      Database.SetInitializer<DataContext>(new DropCreateDatabaseAlways<DataContext>()); 
     } 

     public DbSet<Category> Categories { get; set; } 
    } 
} 

CategoryInitializer.cs

namespace WebApplication1.Data.Initializers 
{ 
    public class CategoryInitializer : DropCreateDatabaseIfModelChanges<DataContext> 
    { 
     protected override void Seed(DataContext context) 
     { 
      GetCategories().ForEach(c => context.Categories.Add(c)); 
      context.SaveChanges(); 
      base.Seed(context); 
     } 
     private static List<Category> GetCategories() 
     { 
      var categories = new List<Category> 
      { 
       new Category {CategoryID = 1, CategoryName = "Category 1" }, 
       new Category {CategoryID = 2, CategoryName = "Category 2"}, 
       new Category {CategoryID = 3, CategoryName = "Category 3"} 
      }; 
      return categories; 
     } 
    } 
} 

Category.cs

namespace WebApplication1.Data.Model 
{ 
    public class Category 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public int CategoryID { get; set; } 
     public string CategoryName { get; set; } 
    } 
} 
+0

Vous définissez un initialiseur standard à la place du vôtre, il devrait être 'Database.SetInitializer (nouveau CategoryInitializer());' –

+0

Je l'ai fait aussi, mais ne fonctionne pas. –

+0

Il vous manque 'Database.Initialize (true);' après votre 'SetInitializer' état. ;-) – LocEngineer

Répondre

0

Changer votre DataContext à ceci:

public DataContext() : base("name=MyDB") 
{ 
    Database.SetInitializer<DataContext>(new CategoryInitializer<DataContext>()); 
    Database.Initialize(true); 
} 

Et votre initialiseur à ceci:

public class CategoryInitializer<T> : DropCreateDatabaseIfModelChanges<DataContext> 
{ 
    public override void InitializeDatabase(DataContext context) 
    { 
     context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction 
      , $"ALTER DATABASE [{context.Database.Connection.Database}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); 

     base.InitializeDatabase(context); 
     context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction 
      , $"ALTER DATABASE [{context.Database.Connection.Database}] SET MULTI_USER WITH ROLLBACK IMMEDIATE"); 
    } 

    protected override void Seed(DataContext context) 
    { 
     //Do your stuff 
    } 

esprit également les <T> dans le initialiseur. Les deux instructions dans InitializeDatabase sont juste pour assurer la migration appropriée.

+0

J'ai implémenté ces codes mais je ne travaille toujours pas –

+0

SVP soyez un peu plus précis quant à "ne pas travailler" Avez-vous une erreur? Avez-vous activé les migrations en premier lieu? – LocEngineer

+0

Attendez une seconde , @ RıdvanSÖYÜ, pourquoi avez-vous deux namespaces différents entre DataContext et Initializer? En fait: Pourquoi avez-vous TROIS espaces de noms différents? – LocEngineer

0

J'ai résolu le problème. J'utilise la bibliothèque de classes pour tous les travaux de données. Donc, pour déboguer pas à pas, j'ai changé le type de sortie de la bibliothèque de classes en application Windows et pour un test, j'écris une classe. Quand je cours le code étape par étape, il m'a donné un message d'erreur qui est "incapable de laisser tomber et de créer la base de données dans le serveur de sql". Cela signifie que ma base de données est en cours d'utilisation. Puis j'ai écrit une requête "use master" puis je cours à nouveau. Et c'est tout. Le problème est résolu et mon initialiseur fonctionne maintenant. Merci tout le monde!