ManuallyprovideDbContexttoDbMigratorPlatform.NET4.5andEntityFramework6。)类//由代码迁移生成varmigratorConfig=currentMigrationProvider.CreateDbMigrationConfiguration();vardbMigrator=newSystem.Data.Entity.Migrations.DbMigrator(migratorConfig);dbMigrator.Update();问题是Update()函数试图创建我的DbContext类的一个实例,出于某些充分的原因,我需要手动创建上下文并将其提供给dbMigrator。那可能吗?这个怎么样?是的,可以控制迁移和上下文。如果您正在管理连接,这很重要。该示例显示连接到2个不同的数据库。这有点令人费解。所以我构建了一个小测试项目来演示如何。以上就是C#学习教程:手动提供DbContext给DbMigrator分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——usingSystem;使用System.Data.Common;使用系统.Data.Entity;使用System.Data.Entity.Infrastructure;使用System.Data.Entity.Migrations;namespaceEf6Test{publicclassProgram{publicstaticvoidMain(string[]args){ExecDb1();执行DB2();();}privatestaticvoidExecDb1(){Database.SetInitializer(newMigrateDatabaseToLatestVersion());WhichDb.DbName="HACKDB1";WhichDb.ConnType=ConnType.CtxViaDbConn;varsqlConn=GetSqlConn4DBName(WhichDb.DbName);varcontext=newEf6Ctx(sqlConn);context.Database.Initialize(true);Console.WriteLine(WhichDb.DbName,context.Database.Exists());添加垃圾(上下文);//sqlConn.Close();//??无论其他考虑因素,处理上下文等......WhichDb.DbName="HACKDB2";WhichDb.ConnType=ConnType.CtxViaDbConn;n2=GetSqlConn4DBName(WhichDb.DbName);varcontext2=newEf6Ctx2(sqlConn2);Console.WriteLine(context2.Database.Exists());Database.SetInitializer(newMigrateDatabaseToLatestVersion());context2.Database.Initialize(true);Console.WriteLine(WhichDb.DbName,context2.Database.Exists());添加垃圾(上下文2);}privatestaticvoidExecDbCtx3(){Database.SetInitializer(newMigrateDatabaseToLatestVersion());//Database.SetInitializer(newCreateDatabaseIfNotExists());//Database.SetInitializer(null);WhichDb.ConnectionName="AppCfgName";WhichDb.ConnType=ConnType.CtxViaConnectionName;varcontext3=newEf6Ctx3(WhichDb.ConnectionName);context3.Database.Initialize(true);Console.WriteLine(WhichDb.ConnectionName,context3.Database.Exists());添加垃圾(上下文3);}publicstaticclassWhichDb{publicstaticstringDbName{get;放;}publicstaticstringConnectionName{get;放;}publicstaticConnTypeConnType{get;放;}}公共枚举ConnType{CtxViaDbConn,CtxViaConnectionName}privatestaticvoidAddJunk(DbContextcontext){varpoco=newpocotest();poco.f1=DateTime.Now.ToString();//poco.f2="有人踩到鸭子了吗?";//评论第二次运行context.Set().Add(poco);context.SaveChanges();}publicstaticDbConnectionGetSqlConn4DBName(stringdbName){varsqlConnFact=newSqlConnectionFactory("DataSource=localhost;IntegratedSecurity=True;MultipleActiveResultSets=True");varsqlConn=sqlConnFact.CreateConnection(dbName);返回sqlConn;}}publicclassMigrationsContextFactory:IDbContextFactory{publicEf6CtxCreate(){switch(Program.WhichDb.ConnType){caseProgram.ConnType.CtxViaDbConn:varsqlConn=Program.GetSqlConn4DBName(Program.WhichDb.DbName);//令人讨厌但它有效returnnewEf6Ctx(sqlConn);caseProgram.ConnType.CtxViaConnectionName:returnnewEf6Ctx(Program.WhichDb.ConnectionName);默认值:抛出新的ArgumentOutOfRangeException();}}}浦blic类MigrationsContextFactory2:IDbContextFactory{publicEf6Ctx2Create(){switch(Program.WhichDb.ConnType){caseProgram.ConnType.CtxViaDbConn:varsqlConn=Program.GetSqlConn4DBName(Program.WhichDb.DbName);//令人讨厌但它有效returnnewEf6Ctx2(sqlConn);caseProgram.ConnType.CtxViaConnectionName:returnnewEf6Ctx2(Program.WhichDb.ConnectionName);默认值:抛出新的ArgumentOutOfRangeException();}}}publicclassMigrationsContextFactory3:IDbContextFactory{publicEf6Ctx3Create(){switch(Program.WhichDb.ConnType){caseProgram.ConnType.CtxViaDbConn:varsqlConn=Program.GetSqlConn4DBName(Program.WhichDb.DbName);//令人讨厌但它有效returnnewEf6Ctx3(sqlConn);caseProgram.ConnType.CtxViaConnectionName:returnnewEf6Ctx3(Program.WhichDb.ConnectionName);默认值:抛出新的ArgumentOutOfRangeException();}}}publicclassEf6MigConf:DbMigrationsConfiguration{publicEf6MigConf(){AutomaticMigrationsEnabled=true;AutomaticMigrationDataLossAllowed=true;}}publicclassEf6MigConf2:DbMigrationsConfiguration{publicEf6MigConf2(){AutomaticMigrationsEnabled=true;AutomaticMigrationDataLossAllowed=true;}}publicclassEf6MigConf3:DbMigrationsConfiguration{publicEf6MigConf3(){AutomaticMigrationsEnabled=true;AutomaticMigrationDataLossAllowed=true;}}publicclasspocotest{publicintId{get;放;}publicstringf1{get;放;}公共字符串f2{得到;放;}//评论第二次运行publicstringf2a{get;放;}//评论第二次运行publicstringf3{get;放;}//评论第二次运行publicstringf5{get;放;}//评论第二次运行publicstringf6b{get;放;}//评论第二次运行放;}}公开课Ef6Ctx2:DbContext{publicEf6Ctx2(DbConnectiondbConn):base(dbConn,true){}publicEf6Ctx2(stringconnectionName):base(connectionName){}publicDbSetpoco1s{get;放;}}}顶一下,如涉及侵权,请点右联系管理员删除如转载请注明出处:
