Question

J'utilise Entity Framework 4.3 sur une base de données existante et j'ai deux ou trois scénarios que je suis en train de répondre à.

Tout d'abord, si je supprime ma base de données je voudrais EF pour Recréer si à partir de zéro -. Je l'ai utilisé avec succès une base de données pour cette CreateDatabaseIfNotExists initialiseur

En second lieu, si je mets à jour mon modèle et la base de données existe déjà, je voudrais la base de données mise à jour automatique -. Je l'ai utilisé avec succès Entity Framework 4.3 pour cette Migrations

Alors, voici ma question. Dis-je ajouter une nouvelle table à mon modèle qui exige des données de référence, ce la meilleure façon d'assurer que ces données est créé deux lorsque la base intialiser fonctionne et aussi lorsque la migration fonctionne. Mon désir est que les données est créée lorsque je crée le db à partir de zéro et aussi quand la base de données est mise à jour à la suite d'une course de migration.

Dans certaines migrations EF exemples que j'ai vu des gens utiliser la fonction SQL () dans la méthode UP de la migration pour créer des données de semences, mais, si possible, je préfère utiliser le contexte pour créer les données de semences (comme vous le voyez dans la plupart des bases de données exemples initialiseur) car il me semble étrange que vous utiliseriez sql pur quand l'idée de EF est abstraire que loin. Je l'ai essayé d'utiliser le contexte dans la méthode UP, mais pour une raison quelconque, il ne pense pas qu'une table qui a été créé dans la migration existait quand j'ai essayé d'ajouter les données de semences directement sous l'appel pour créer la table.

Toute la sagesse grandement appréciée.

Était-ce utile?

La solution

Si vous souhaitez utiliser des entités aux données de semences, vous devez utiliser la méthode de Seed dans la configuration des migrations. Si vous générez Enable-Migrations frais de projet, vous obtiendrez cette classe de configuration:

internal sealed class Configuration : DbMigrationsConfiguration<YourContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(CFMigrationsWithNoMagic.BlogContext context)
    {
        //  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" }
        //    );
        //
    }
}

La façon dont les données de semences de migrations ne sont pas très efficaces, car il est censé être utilisé pour un semis très basique. Chaque mise à jour vers la nouvelle version passera par tout ensemble et essayer de mettre à jour les données existantes ou insérer de nouvelles données. Si vous ne pas utiliser la méthode d'extension AddOrUpdate vous devez vous assurer que les données manuellement sont ensemencées à la base de données que si elles ne sont pas présents encore.

Si vous voulez de façon efficace pour l'ensemencement parce que vous devez semences o beaucoup de données que vous obtiendrez un meilleur résultat avec commun:

public partial class SomeMigration : DbMigration
{
    public override void Up()
    {
        ...
        Sql("UPDATE ...");
        Sql("INSERT ...");
    }

    public override void Down()
    {
        ...
    }
}

Autres conseils

Je recommande de ne pas utiliser les appels Sql() dans votre méthode Up() parce que (OMI) ce qui est vraiment destiné pour le code de migration réelle pour laquelle il n'y a pas de fonction intégrée, plutôt que le code de la graine.

Je me plais à penser des données de semences comme quelque chose qui pourrait changer à l'avenir (même si mon schéma ne fonctionne pas), donc j'écris simplement des chèques « défensifs » autour de tous mes inserts dans la fonction de démarrage pour vous assurer que l'opération ne pas tirer dessus.

Considérons un scénario dans lequel vous avez une table « Types » qui commence avec 3 entrées, mais vous ajoutez plus tard 4. Vous ne devriez pas avoir besoin d'une « migration » pour y remédier.

Utilisation Seed() vous donne également un contexte plein de travailler avec, ce qui est beaucoup plus agréable que d'utiliser les chaînes SQL simples dans la méthode Sql() que Ladislav a démontré.

De plus, gardez à l'esprit que l'avantage d'utiliser des méthodes intégrées EF tant pour le code de la migration et le code de démarrage est que vos opérations de base de données restent plate-forme neutre. Cela signifie que vos changements de schéma et les requêtes sont en mesure de fonctionner sur Oracle, Postgre, etc. Si vous écrivez SQL brute réelle, alors vous êtes potentiellement vous enfermer dans inutilement.

Vous pourriez être moins préoccupé par ce puisque 90% des personnes qui utilisent EF ne jamais frappé SQL Server, mais je suis juste jeter là pour vous donner un autre point de vue sur la solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top