Stratégie d'initialisation personnalisée pour EF premier code qui ne baisse pas les tables pour ajouter une colonne

StackOverflow https://stackoverflow.com/questions/5312017

Question

Le dernier code EF premier paquet NuGet est livré avec une implémentation personnalisée de IDatabaseInitializer appelé DontDropDbJustCreateTablesIfModelChanged. Comme son nom l'indique, lors d'un changement de modèle est détecté, il ne sautera pas et recréer la base de données entière, juste supprimer et recréer les tables.

Dire que j'ai cette classe de modèle:

public class User
{
    public string Username { get; set; }

    // This property is new; the model has changed!
    public string OpenID { get; set; }
}

Comment peut-on s'y prendre pour mettre en œuvre un IDatabaseInitializer que ne baisse pas de tables soit . Dans ce cas, il suffit d'ajouter une colonne OpenID à la table de l'utilisateur?

Était-ce utile?

La solution

Je pense qu'il est une question de SQL. Donc, pour SQL Server, vous pouvez écrire quelque chose comme:

public class MyInitializer : IDatabaseInitializer<MyContext>
{
    public void InitializeDatabase(MyContext context)
    {
        context.Database.SqlCommand(
            @"
            IF NOT EXISTS (SELECT 1 FROM sys.columns AS col
                           INNER JOIN sys.tables AS tab ON tab.object_Id = col.object_Id
                           WHERE tab.Name = 'User' AND col.Name = 'OpenId')
            BEGIN
                ALTER TABLE dbo.User ADD OpenId INT; 
            END");
    }
}

Mais de la même manière que vous pouvez exécuter ce script sans l'ajouter à votre application que je pense est bien meilleure approche.

Autres conseils

Avec la version actuelle du Code d'abord, vous ne pouvez pas modifier simplement votre schéma et conserver toutes les données que vous pourriez avoir dans vos tables. Si le maintien des données, telles que les tables de données de référence / recherche est importante dans cette version, vous pouvez créer votre propre Initializer et substituez la méthode des semences pour remplir vos tables

public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyContext>
{
    protected override void Seed(MyContext context)
    {
        var countries = new List<Country>
        {
            new Country {Id=1, Name="United Kingdom"},
            new Country{Id=2, Name="Ireland"}
        };

        countries.ForEach(c => context.Countries.Add(c));
    }
}

Et puis utilisez dans votre Application_Start:

Database.SetInitializer<MyContext>(new MyDbInitializer());

Je crois que cela est actuellement adressée par l'équipe EF, mais n'a pas été prêts à être libérés au moment où le premier code baisse est sorti. Vous pouvez voir un aperçu ici: premier code migrations

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