Schema-IndependentEntityFrameworkCodeFirstMigration我在使用EntityFramework迁移Oracle数据库时遇到了麻烦,因为schema名称包含在迁移代码中,而对于Oracle,架构名称也是用户名。我的目标是实施与模式无关的代码优先迁移(能够为测试和生产环境提供一组迁移)。我试过这种方法(使用EntityFramework6.1.3):1)我在Web.config中有架构名称:2)我的DbContext将架构名称作为构造函数参数:publicEdistributionDbContext(stringschemaName):base(“EdistributionConnection"){_schemaName=schemaName;}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){modelBuilder.HasDefaultSchema(_schemaName);}3)我必须为实体框架迁移实现IDbContextFactory以创建没有无参数构造函数的DbContextFactory:}}4)我还将迁移历史表配置为正确的架构:}}5)我修改了为迁移生成的代码以替换硬编码的架构名称。例如。我用CreateTable($"{_schema}.Users")CreateTable("IPR_TEST.Users")替换了CreateTable("IPR_TEST.Users")CreateTable($"{_schema}.Users")。(_schema字段根据Web.config中的值设置)。6)我使用MigrateDatabaseToLatestVersion()数据库初始值设定项。通过所有这些设置,当我切换到不同的模式(例如通过web.config转换)时,我仍然遇到问题-抛出异常告诉我数据库与我的模型不匹配,并且AutomaticMigrations被禁用(这是必需的).当我尝试添加迁移时,会生成一个新的迁移,其中所有对象都应移动到不同的模式(例如:MoveTable(name:“IPR_TEST.DistSetGroups”,newSchema:“IPR”);这绝对不是想要的...对我来说,模式名称似乎在迁移类的模型字符串哈希中的某处硬连线(例如,201509080802305_InitialCreate.resx),即:H4sIAAAAAAAEAO09227jO...有没有办法告诉代码优先迁移忽略模式名称?您可以在DbContext中创建派生的DbContext并“覆盖”modelBuilder.HasDefaultSchema(...):);}}然后您可以为两个上下文创建迁移。请参阅此问题了解如何在一个项目中创建两个迁移。这种方法的缺点是您必须保留两个单独的迁移。但它让您有机会调整TestDbContext的配置。我遇到了同样的问题,感谢您的帮助,我终于找到了一个似乎运行良好的解决方案:1)我在Web.config应用程序设置中有架构名称:2)我有一个历史上下文:publicclassHistoryDbContext:HistoryContext{内部静态只读字符串SCHEMA;静态HistoryDbContext(){SCHEMA=ConfigurationManager.AppSettings["Schema"];}publicHistoryDbContext(DbConnectiondbConnection,stringdefaultSchema):base(dbConnection,defaultSchema){D}protectedModelBuildingoverrideatvoidmodelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.HasDefaultSchema(SCHEMA);}}3)我有一个数据库配置引用我的历史数据库上下文:}}4)这是我的数据库上下文:publicpartialclassMyDbContext:DbContext{publicMyDbContext():base("name=MyOracleDbContext"){}publicstaticvoidInitialize(){DbConfiguration.设置配置(新的MyDbConfiguration());数据库e.SetInitializer(newMigrateDatabaseToLatestVersion());}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){modelBuilder.HasDefaultSchema(string.Empty);}}5)最后,我从global.asax中调用Initialize方法protectedvoidApplication_Start(){MyDbContext.Initialize();关键是将数据库上下文的默认架构设置为String.Empty并将历史上下文的架构设置为正确的架构,以便在创建迁移时它们是独立于架构的:迁移的resx的DefaultSchema变量将为空。但是历史数据库上下文架构仍然是正确的,可以通过迁移检查。我使用以下nugets包:然后您可以在不同的数据库上成功使用Oracle迁移。以上就是C#学习教程的全部内容:模式无关实体框架代码的第一次迁移分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
