web-dev-qa-db-fra.com

Créer une table et y insérer des données lors de la première migration du code EF

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 ...

13
Gab

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:

  • Il s'exécute chaque fois que le 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.
  • Il doit gérer les cas où la base de données contient déjà des données car Migrations fait évoluer la base de données plutôt que de la supprimer et de la recréer.

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.

15
octavioccl

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
11
Vishnu Mallipudi

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).

7
Francesc Castells

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

1
Hizabr