good day! ideas on why context.database.create() still goes through classes : dbmigration. if dont drop database, migration works fine. if drop database , start new one. go through migration list , try update , return error dbo."tablename" not found.
here code
public class dmsdbcontextinitializer : dmsdbcontextinitializerbase, idatabaseinitializer<dmsdbcontext> { public void initializedatabase(dmsdbcontext context) { var dbname = context.database.connection.database; if (context.database.exists()) { var migrator = new dbmigrator(new migrationconfiguration { automaticmigrationsenabled = false }); //get pending migrations var pendingmigrations = migrator.getpendingmigrations().select(x => new { numericid = convert.toint64(x.split(new[] { '_' })[0]), migrationid = x }).tolist(); //get last migration entry var latestmigrationhistory = context.getmigrationhistories().orderbydescending(x => x.migrationid).firstordefault(); if (latestmigrationhistory != null) { var latestmigrationid = convert.toint64(latestmigrationhistory.migrationid.split(new[] { '_' })[0]); var prevmigrations = pendingmigrations.where(x => x.numericid < latestmigrationid); //exclude prev migration in update , insert fake history table record each foreach (var prevmigration in prevmigrations) { context.database.executesqlcommand(transactionalbehavior.donotensuretransaction, @"insert __migrationhistory (migrationid,contextkey,model, productversion) values (@p0,@p1,@p2,@p3)", prevmigration.migrationid, migrator.configuration.contextkey, latestmigrationhistory.model, latestmigrationhistory.productversion ); } } //execute valid pending migrations if (migrator.getpendingmigrations().any()) migrator.update(); /*some seed , update codes*/ context.savechanges(); } else { //create db context.database.create(); configurefiletablesupport(context, dbname); configureimagefiletablesupport(context, dbname); //initial data seed(context); }
in context.database.create(), if press f11, go through class : dbmigration. cant seem find @ fault here.
here dbcontext
public class dmsdbcontext : basedbcontext, idmsdbcontext { public dmsdbcontext() : base("dmsctx") { } public dmsdbcontext(string connectionstring) : base(connectionstring) { } public idbset<filemetadata> filemetadata { get; set; } public idbset<filemetadatacontent> filemetadatacontents { get; set; } public idbset<sharedfile> sharedfiles { get; set; } public idbset<auditfilemetadata> auditfilemetadata { get; set; } public itransactionscope createtransactionscope() { return new eftransactionscope(database.begintransaction()); } public ienumerable<t> sqlquery<t>(string sql, params object[] parameters) { return database.sqlquery<t>(sql, parameters); } public int executesqlcommand(string sql, params object[] parameters) { return database.executesqlcommand(sql, parameters); } public string databasename { { return database.connection.database; } } /// <summary> /// query migration history table /// </summary> /// <returns></returns> public ilist<migrationhistory> getmigrationhistories() { return database.sqlquery<migrationhistory>("select * __migrationhistory").tolist(); } } public interface idmsdbcontext { idbset<filemetadata> filemetadata { get; set; } idbset<filemetadatacontent> filemetadatacontents { get; set; } idbset<sharedfile> sharedfiles { get; set; } idbset<auditfilemetadata> auditfilemetadata { get; set; } int savechanges(); dbcontextconfiguration configuration { get; } itransactionscope createtransactionscope(); ienumerable<t> sqlquery<t>(string sql, params object[] parameters); int executesqlcommand(string sql, params object[] parameters); string databasename { get; } }
im not sure why implementing "exact"/close functionality of how ef migrations works yourself?
isn't after createdatabaseifnotexists db initialization strategy? or me not reading question enough?
public class schooldbcontext: dbcontext { public schooldbcontext(): base("schooldbconnectionstring") { database.setinitializer<schooldbcontext>(new createdatabaseifnotexists<schooldbcontext>()); //database.setinitializer<schooldbcontext>(new dropcreatedatabaseifmodelchanges<schooldbcontext>()); //database.setinitializer<schooldbcontext>(new dropcreatedatabasealways<schooldbcontext>()); //database.setinitializer<schooldbcontext>(new schooldbinitializer()); } public dbset<student> students { get; set; } public dbset<standard> standards { get; set; } }
read more: ef db initialization strategies more migrations: ef code first migrations