J'utilise Entity Framework Code First avec les migrations Code First.
Lors d'une migration, je dois créer une nouvelle table, puis y insérer des données.
Je crée donc la table avec:
CreateTable("MySchema.MyNewTable",
c => new
{
MYCOLUMNID = c.Int(nullable: false, identity: true),
MYCOLUMNNAME = c.String(),
})
.PrimaryKey(t => t.MYCOLUMNID);
Ensuite, j'essaie d'insérer des données avec:
using (var context = new MyContext())
{
context.MyNewTableDbSet.AddOrUpdate(new[]
{
new MyNewTable
{
MYCOLUMNNAME = "Test"
}
});
context.SaveChanges();
}
Mais je reçois une erreur:
Nom d'objet non valide "mySchema.MyNewTable".
Est-il possible de faire ce dont j'ai besoin? Créer une table et y insérer des données dans la même migration?
J'ai déjà d'autres migrations où je crée des tables ou j'insère des données dans une table, mais jamais dans la même migration ...
Ma recommandation est de déplacer le code inséré vers la méthode Seed . Les migrations ont introduit leur propre méthode Seed
sur la classe DbMigrationsConfiguration . Cette méthode Seed
est différente de la méthode Seed
de l'initialiseur de base de données de deux manières importantes:
Update-Database
La commande PowerShell est exécutée. À moins que l'initialiseur Migrations ne soit utilisé, la méthode Migrations Seed
ne sera pas exécutée au démarrage de votre application.Pour cette dernière raison, il est utile d'utiliser la méthode d'extension AddOrUpdate
dans la méthode Seed
. AddOrUpdate
peut vérifier si une entité existe déjà dans la base de données, puis insérer une nouvelle entité si elle n’existe pas déjà ou mettre à jour l’entité existante si elle existe.
Donc, essayez d'exécuter le script que vous souhaitez de cette façon:
Update-Database –TargetMigration: ScriptName
Et la méthode Seed
fera le travail d'insertion de données.
Comme Julie Lerman l'a dit sur elle blog :
Le travail d'AddOrUpdate est de s'assurer que vous ne créez pas de doublons lorsque vous amorcez des données pendant le développement.
Vous pouvez essayer cette approche: après avoir créé la table, créez une autre migration vide dans votre console du gestionnaire de packages en utilisant:
Add-Migration "MigrationName"
Ouvrez ensuite le fichier .cs
De cette migration et, dans la méthode Up()
, insérez ce code:
Sql("INSERT INTO MyNewTable(NyColumnName) Values('Test')");
Après cela, enregistrez et revenez à Package Manager Console et mettez à jour la base de données en utilisant:
Update-Database
Une façon de faire des choses "aléatoires" dans les migrations consiste à utiliser la méthode méthode SQL et à transmettre toute instruction SQL dont vous avez besoin pour effectuer, par exemple, l'insertion de données.
C'est la meilleure approche si vous voulez que vos migrations puissent générer un script SQL de migration complet, y compris vos opérations de données (la méthode Seed ne peut être exécutée qu'en code et n'en générera pas) script sql).
Pour ceux qui recherchent la solution EF Core
, Dans la méthode Up
et après avoir créé la table:
c'est-à-dire: migrationBuilder.CreateTable(name: "MyTable", .....
ajoutez le code suivant:
migrationBuilder.InsertData(table: "MyTable", column: "MyColumn", value: "MyValue");
ou
migrationBuilder.InsertData(table: "MyTable", columns: ..., values: ...);
Pour plus d'informations, consultez les documents: MigrationBuilder.InsertData Method