Wie vermeiden Sie doppelte Dateien-Datenbank verwaltet EntityFramework, verursacht durch die Seed-Methode?
Jedes mal, wenn ich die Anwendung ausführen gleichen Objekte in der Datenbank Hinzugefügt werden(Duplikate).
Meine Global.asax
:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using WebApplication2.Migrations;
using WebApplication2.Models;
namespace WebApplication2 {
public class MvcApplication : System.Web.HttpApplication {
protected void Application_Start() {
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());
//Database.SetInitializer(new DropCreateDatabaseAlways<ApplicationDbContext>());
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
und Meine Configuration.cs
mit Seed
Methode:
namespace WebApplication2.Migrations
{
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using WebApplication2.Models;
internal sealed class Configuration : DbMigrationsConfiguration<WebApplication2.Models.ApplicationDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
ContextKey = "WebApplication2.Models.ApplicationDbContext";
}
protected override void Seed(WebApplication2.Models.ApplicationDbContext context) {
var persons = new List<Person> {
new Person{FirstName = "John", LastName = "Doe", CellNumber = "123-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "312312312", Notes = "Annoying"},
new Person{FirstName = "Anna", LastName = "Doe", CellNumber = "113-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "548555672", Notes = "Less Annoying"}
};
persons.ForEach(person => context.Persons.AddOrUpdate(person));
context.SaveChanges();
var meetings = new List<Meeting>{
new Meeting{PersonId = 1, Body = "Body of meeting", Date = DateTime.Now}
};
meetings.ForEach(meeting => context.Meetings.AddOrUpdate(meeting));
context.SaveChanges();
var statuses = new List<Status> {
new Status{Name = "OK"},
new Status {Name = "NOT_OK"}
};
statuses.ForEach(status => context.Statuses.AddOrUpdate(status));
context.SaveChanges();
}
}
}
Jedes mal, wenn ich die app starte Seed
fügt doppelte Einträge:
Ich brauchte, um zu kommentieren Inhalt der Seed-Methode, um zu verhindern, dass das hinzufügen von Duplikaten.
Frage: (1) Was sollte ich ändern, so Seed
Methode wird nur ausgeführt, um die Datenbank neu erstellen nach der migration?
EDIT:
In der Seed
Methode ist Kommentar:
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
//
aber meine Methode heißt IMMER, nicht nur nach Migrationen. Warum ist es so?
Drop/create-Datenbank auf jedem Lauf.
InformationsquelleAutor Yoda | 2014-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom diese Seite (etwa auf halbem Weg nach unten), die Quelle wurde von diese Antwort
Könnten Sie auch einen Blick in die
AddOrUpdate
Methode, wie verwiesen, in diese Antwort, das sollte auch für Ihre Zwecke.Ich wechselte schnell den code, den ich aus den erhaltenen Antworten weiter oben verlinkt, so mit mir tragen, wenn es ein Problem mit dem code unten. Das Konzept sollte noch relativ klar sein, glaube ich.
AddOrUpdate
Recht und es jetzt noch Hinzugefügt, Duplikate.Ich möchte nur, um es ausführen Saatgut-Methode nach der migration neu erstellen Datenbank-form zu kratzen.
Diese Frage zu bieten scheint eine bessere Erklärung für die Verwendung der
AddOrUpdate
Methode, wenn Sie nicht wissen, die Primärschlüssel der Daten.Warum definierst du
Id
(PK) explizit? Sollte das nicht Entity Framework, es zu tun?Man muss sich ja irgendwie informieren, entity framework, die Sie nicht möchten, dass diese Duplikate. Der einfachste Weg, dies zu tun ist, um den Schlüssel. In einem früheren Kommentar habe ich ein link enthalten, sollte es Ihnen ermöglichen, zu sagen, entity framework zu suchen, vorhandene Datensätze mit beliebigen Feldern, aber ich fühlte, dass darunter, dass in meiner Antwort möchte hinzufügen, einige unnötige Komplexität. Vielleicht war ich falsch, diese Entscheidung zu treffen. Aber du hast Recht, entity framework, weisen Sie den Primärschlüssel auf seine eigenen (solange Sie nicht), welches die richtig Ansatz.
InformationsquelleAutor Joshua Shearer
Haben Sie vollen Zugriff auf den Kontext, in den
Seed
Methode, so können Sie Abfragen, um zu sehen, ob bereits Daten vorhanden sind.Beispielsweise können Sie die Samen, die Tabellen nur, wenn Sie leer sind...
Können Sie auch
AddOrUpdate
, aber Sie brauchen, um zu sagen, EF, wie um zu prüfen, ob der Datensatz vorhanden ist, mit dem ersten parameter...AddOrUpdate
funktioniert auch.Ich weiß nicht warum, aber es funktioniert nicht in meinem Fall ist es noch fügt Duplikate glücklich(siehe code im OP) ich usd
AddOrUpdate
.Aktualisierte Antwort, wie Sie möchten, verwenden
AddOrUpdate
InformationsquelleAutor Anthony Chu
Wenn Sie nur Saatgut von Daten, wenn Ihre Datenbank ist erstellt. In diesem Fall können Sie eine Datenbank erstellen Initialiser von CreateDatabaseIfNotExist Initialiser. Dann in der DatabaseInitialiser Klasse, können Sie überschreiben die Seed-Methode mit Ihren Daten auch dort, statt des MigrationConfiguration Klasse. Weitere Informationen finden Sie im angefügten link.
Datenbank-Initialisierung Strategien des Code-First:
In der migration-Konfiguration. die seed-Methode wird jedesmal aufgerufen, wenn die migration der Datenbank passiert. Das ist, warum Ihr seed-Methode wird aufgerufen, die ganze Zeit.
Im angehängten link gibt es noch eine initialiser ich nicht erwähnen, migratedbtolatestversion. Dies ist ähnlich wie diese, die Sie verwenden in der Konfiguration.cs
In dem link oben nicht erwähnt migratedbtolatestversion initialiser. Dies ist ähnlich wie diese, die Sie verwenden in der Konfiguration.cs. Das problem hier könnte werden verursacht durch die Aktivierung von auto-migration. Denn jedes mal , ef berechnen, ob es migration oder nicht erforderlich, so dass Sie Ihre Konfiguration.cs wird aufgerufen, immer wenn, daher,seed genannt wurde, wie jedes mal. Ich denke, die EF obige Beschreibung ist nicht sehr klar über seinen tatsächlichen Verhalten. Vielleicht deaktivieren Sie die automatische migration erste und sehen, wenn Verhalten geändert werden. Oder bewegen Saatgut überschreiben von config in eine MigrateDbToLatestverion initialiser.
InformationsquelleAutor anIBMer
InformationsquelleAutor RAJITHA DINESH
Dieser arbeitete für mich
InformationsquelleAutor Paco Francisco Rodeño Sanchez
Erste, reset Ihre Primärschlüssel, um sicher zu sein, dass es keine doppelten Schlüssel
Dann verwenden
AddOrUpdate
Methode, um Saatgut DatenInformationsquelleAutor Masoud Darvishian