2016-07-06 11 views
2

Ich entwickle ein .Net-Projekt. Ich verwende Entity Framework Code ersten Ansatz, um mit der Datenbank zu interagieren. Ich säte während der Entwicklung einige Pseudodaten in meine Datenbank ein. Aber das Seeding funktioniert nicht. Ich folgte diesem Link - http://www.entityframeworktutorial.net/code-first/seed-database-in-code-first.aspx. Bitte beachten Sie meinen Code unten.Seeding funktioniert nicht in Entity Framework Code Erste Annäherung

Das ist meine ContextInitializer Klasse

public class ContextInitializer : System.Data.Entity.CreateDatabaseIfNotExists<StoreContext> 
    { 

     protected override void Seed(StoreContext context) 
     { 
      IList<Brand> brands = new List<Brand>(); 
      brands.Add(new Brand { Name = "Giordano" ,TotalSale = 1 }); 
      brands.Add(new Brand { Name = "Nike" , TotalSale = 3 }); 

      foreach(Brand brand in brands) 
      { 
       context.Brands.Add(brand); 
      } 
      base.Seed(context); 
      context.SaveChanges(); 

     } 
    } 

Das ist meine Kontextklasse

public class StoreContext : DbContext,IDisposable 
    { 
     public StoreContext():base("DefaultConnection") 
     { 
      Database.SetInitializer(new ContextInitializer()); 
     } 

     public virtual DbSet<Category> Categories { get; set; } 
     public virtual DbSet<Brand> Brands { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
     } 
    } 

Das ist meine Marke Klasse

public class Brand 
    { 
     public int Id { get; set; } 
     [Required] 
     [MaxLength(40)] 
     public string Name { get; set; } 
     public int TotalSale { get; set; } 
    } 

I-Lösungen online recherchiert und ich folgte Anweisungen. Ich laufe auch context.SaveChanges. Aber es werden keine Daten in die Datenbank eingefügt. Bitte warum funktioniert es nicht? Wie kann ich es bitte reparieren?

Antwort

3

Sie sind die falschen initializer nehmen, CreateDatabaseIfNotExists nur, wenn die Datenbank aufgerufen wird existiert nicht!

Sie zum Beispiel DropCreateDatabaseIfModelChanges verwenden können:

Lösung 1)

public class ContextInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<StoreContext> 
{ 

Sie haben mit diesem Ansatz kümmern, es !!! entfernt !!! alle vorhandenen Daten.

Lösung 2)

Erstellen eines benutzerdefinierten DbMigrationsConfiguration:

public class Configuration : DbMigrationsConfiguration<StoreContext> 
{ 
    public Configuration() 
    { 
     // Take here! read about this property! 
     this.AutomaticMigrationDataLossAllowed = true; 
     this.AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(StoreContext context) 
    { 
     IList<Brand> brands = new List<Brand>(); 
     brands.Add(new Brand { Name = "Giordano", TotalSale = 1 }); 
     brands.Add(new Brand { Name = "Nike", TotalSale = 3 }); 

     foreach (Brand brand in brands) 
     { 
      context.Brands.AddOrUpdate(m => m.Name, brand); 
     } 
     base.Seed(context); 
     context.SaveChanges(); 
    } 
} 

Auf diese Weise können genannt können (!! Bevor erstellen Sie die DbContext oder im DbContext Konstruktor !!):

// You can put me also in DbContext constuctor  
Database.SetInitializer(new MigrateDatabaseToLatestVersion<StoreContext , Yournamespace.Migrations.Configuration>("DefaultConnection")); 

Hinweise:

  • DbMigrationsConfiguration müssen über die Verbindungszeichenfolge wissen Sie können diese Informationen im Konstruktor oder von außen bereitstellen.
  • in Ihrem DbMigrationsConfiguration können Sie auch so konfigurieren:
    • MigrationsNamespace
    • MigrationsAssembly
    • MigrationsDirectory
    • Target

Wenn Sie alles Standard wie in meinem Beispiel lassen dann Sie tun nichts ändern müssen!

0

die Initializer für eine Datenbank einstellen VOR der Kontext geschehen immer so erstellt wird ...

public StoreContext():base("DefaultConnection") 
    { 
     Database.SetInitializer(new ContextInitializer()); 
    } 

ist viel zu spät. Wenn Sie es statisch gemacht, dann könnte es funktionieren:

static StoreContext() 
    { 
     Database.SetInitializer(new ContextInitializer()); 
    } 
+0

Ich habe diese statische StoreContext() { Database.SetInitializer (neue ContextInitializer()); } unterhalb des vorhandenen Konstruktors. Aber es funktioniert nicht. Ich kann den vorhandenen Konstruktor nicht löschen, weil er eine Verbindungszeichenfolge definiert und einen Fehler auslöst, wenn ich das tue. Bitte, was ist falsch mit dem, was ich mache, bitte? –

+0

Oh. Ich denke, dass ich dieses hinzufügen müssen auf dem Web. Konfigurationsdatei. Aber wenn ich hinzufüge, heißt es, Initialisierer kann nicht gesetzt werden. Ich setze PatheinFashionStore.Domain.Concrete.StoreContext ist mein Kontext-Klasse und PatheinFashionStore Hauptprojekt. Also bitte ist das richtig. Die Art, wie ich untergehe. –

+0

Ich habe das Gefühl, dass Sie nicht verstehen [Wann wird die Seed-Methode in einem ersten Migrationsszenario des EF-Codes aufgerufen?] (Http://stackoverflow.com/questions/24142107/when-is-the-seed-method-called) -in-ef-Code-Erstmigrationen-Szenario). –

0

Ihr Code funktioniert, wenn Sie Ihre vorhandene Datenbank löschen und das EF erstellen und Aussäen der Daten

Oder

können Sie verwenden DbMigrationsConfiguration insted CreateDatabaseIfNotExists und Ihr Code wie folgt ändern:

Zuerst Sie die vorhandene Datenbank löschen haben

ContextInitializer Klasse

public class ContextInitializer : System.Data.Entity.Migrations.DbMigrationsConfiguration<StoreContext> 
{ 
    public ContextInitializer() 
    { 
     this.AutomaticMigrationDataLossAllowed = true; 
     this.AutomaticMigrationsEnabled = true; 
    } 
    protected override void Seed(StoreContext context) 
    { 
     IList<Brand> brands = new List<Brand>(); 
     brands.Add(new Brand { Name = "Giordano", TotalSale = 1 }); 
     brands.Add(new Brand { Name = "Nike", TotalSale = 3 }); 

     foreach (Brand brand in brands) 
     { 
      context.Brands.AddOrUpdate(m => m.Name, brand); 
     } 
     base.Seed(context); 
     context.SaveChanges(); 

    } 
} 

StoreContext

public class StoreContext : DbContext, IDisposable 
    { 
     public StoreContext() : base("DefaultConnection") 
     { 
      Database.SetInitializer(new MigrateDatabaseToLatestVersion<StoreContext, ContextInitializer>()); 
      // Database.SetInitializer(new ContextInitializer()); 
     } 

     public virtual DbSet<Category> Categories { get; set; } 
     public virtual DbSet<Brand> Brands { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
     } 
    } 

Dann in deinem Samen jede Änderung wird in der Datenbank automatisch reflektiert

+0

Wenn ich von DbMigrationsConfiguration erben, wird Fehler während der Kompilierung ausgelöst. –

+0

versuchen, mit System.Data.Entity.Migrations; –

+0

Bei der Ausführung wird die Ausnahme "Datenbank kann nicht aktualisiert werden, die dem aktuellen Modell entspricht" ausgegeben. Wenn ich die Datenbank von der Konsole aus aktualisiere, heißt es: "In der Assembly 'PatheinFashionStore.Domain' wurde mehr als ein Migrationskonfigurationstyp gefunden. Geben Sie den Namen des Benutzers an, der verwendet werden soll." Ich benutze den zweiten Weg. –

Verwandte Themen