sql >> Database teknologi >  >> RDS >> Mysql

Hvordan opretter man initializer for at oprette og migrere mysql-database?

Jeg tror, ​​du er der stort set - du kan slå kildekoden til MigrateDatabaseToLatestVersion (det er open source http://entityframework.codeplex.com/ ) - det er ret forenklet, hvad det stort set gør er at kalde DbMigrator - så vidt jeg kunne se.

Alt du skal gøre ser ud til at fusionere de to - brug det ene eller det andet som grundlag, tilføj anden funktionalitet derinde - det burde fungere fint synes jeg.

class CreateAndMigrateDatabaseInitializer<TContext, TConfiguration> : CreateDatabaseIfNotExists<TContext>, IDatabaseInitializer<TContext> 
    where TContext : DbContext
    where TConfiguration : DbMigrationsConfiguration<TContext>, new()
{
    private readonly DbMigrationsConfiguration _configuration;
    public CreateAndMigrateDatabaseInitializer()
    {
        _configuration = new TConfiguration();
    }
    public CreateAndMigrateDatabaseInitializer(string connection)
    {
        Contract.Requires(!string.IsNullOrEmpty(connection), "connection");

        _configuration = new TConfiguration
        {
            TargetDatabase = new DbConnectionInfo(connection)
        };
    }
    void IDatabaseInitializer<TContext>.InitializeDatabase(TContext context)
    {
        Contract.Requires(context != null, "context");

        var migrator = new DbMigrator(_configuration);
        migrator.Update();

        // move on with the 'CreateDatabaseIfNotExists' for the 'Seed'
        base.InitializeDatabase(context);
    }
    protected override void Seed(TContext context)
    {
    }
}
 

kald det sådan her...

Database.SetInitializer(new CreateAndMigrateDatabaseInitializer<GumpDatabase, YourNamespace.Migrations.Configuration>());
 

... faktisk tilsidesætte det (da det er generisk implementering), som du gjorde for CreateDatabaseIfNotExists (du har bare ekstra 'param' til konfiguration) - og giv bare 'Seed'.

class GumpDatabaseInitializer : CreateAndMigrateDatabaseInitializer<GumpDatabase, YourNamespace.Migrations.Configuration> { protected override void Seed(GumpDatabase context) { context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX Name ON Stations (Name)"); } }

...og kald det noget i retning af

Database.SetInitializer(new GumpDatabaseInitializer());
 

EDIT: Baseret på kommentarerne - DbMigrator bør ikke køre to gange. Den tjekker altid (bruger lidt tid) og laver en 'tom' opdatering og går videre. Men for en sikkerheds skyld, hvis du gerne vil fjerne det og 'tjekke' før du går ind - det burde virke (ændre det lignende stykke ovenfor)...

var migrator = new DbMigrator(_configuration);
if (!context.Database.CompatibleWithModel(throwIfNoMetadata: false))
    if (migrator.GetPendingMigrations().Any())
        migrator.Update();
 

(dette er et overflødigt / dobbelttjek - et af hvis-erne skulle være nok. Sæt en pause der - og se præcis hvad der sker, det skal ikke komme ind - når først Db er migreret. Som nævnt fungerer det fint når jeg test det.

EDIT:

Udskift indersiden af ​​InitializeDatabase med...

var doseed = !context.Database.Exists();
// && new DatabaseTableChecker().AnyModelTableExists(context);
// check to see if to seed - we 'lack' the 'AnyModelTableExists' - could be copied/done otherwise if needed...

var migrator = new DbMigrator(_configuration);
// if (doseed || !context.Database.CompatibleWithModel(throwIfNoMetadata: false))
    if (migrator.GetPendingMigrations().Any())
        migrator.Update();

// move on with the 'CreateDatabaseIfNotExists' for the 'Seed'
base.InitializeDatabase(context);
if (doseed)
{
    Seed(context);
    context.SaveChanges();
}
 

Dette virker omkring (halvvejs) ikke-seed - hvis migreringen går først. Og migreringer skal være først, ellers har du problemer.

Du skal stadig gøre det ordentligt - dette er kernen, hvis ikke alt, du måske har brug for - men hvis der er problemer med MySQL osv., er der sandsynligvis noget mere benarbejde her.

Bemærk: Stadig seeding kalder ikke, hvis du har en db, men den er tom. Problemet er at blande de to forskellige initialiseringer. Så du bliver nødt til at finde ud af det - enten ved at implementere, hvad Create... gør indeni (det opkald kan vi ikke kalde) eller noget andet.



  1. Automatisk dataindsamling:Databasefiler og logiske drev i MS SQL Server

  2. Gendan MySQL-fejl:Serveren lukkede forbindelsen (node.js)

  3. Flask_SQLAlchemy, MySQL, gemme svenske tegn å, ä, ö?

  4. JSON_ARRAY_INSERT() – Indsæt værdier i et JSON-array i MySQL