FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 8475|回复: 9

关于AppBox修改Model后数据重新初始的修改方式

[复制链接]
发表于 2014-1-8 11:44:39 | 显示全部楼层 |阅读模式
        经过一段时间的使用,AppBox系统确实非常不错,结构清晰,但是存在一个问题就是每次运行调试或者重启IIS后运行都会重新初始数据库,导致数据丢失。在开发阶段这不是什么大问题,但是一旦部署正式启用后,就会导致数据丢失,这是个非常大的问题。出现这个问题的原因在于AppBox的数据初始类使用了DropCreateDatabaseAlways,在论坛中记得有篇帖子建议修改为DropCreateDatabaseIfModelChanges,但是这并不能完美解决这个问题,因为一旦数据模型进行了修改,仍然会执行DropCreateDatabase。
        Entity Framework从4.0开始,增加了Migrations类,这个类的功能是数据迁移,即在不丢失数据的情况下升级数据模型。这对AppBox的修改如下:

1、将AppBox的数据初始类AppBoxDatabaseInitializer,由“DropCreateDatabaseAlways”修改为“DbMigrationsConfiguration”,代码如下:
原代码:
  1. public class AppBoxDatabaseInitializer : DropCreateDatabaseAlways<AppBoxContext>
复制代码
修改为:
  1. internal sealed class AppBoxDatabaseInitializer : DbMigrationsConfiguration<AppBox.AppBoxContext>
复制代码
同时设置类的初始函数:
  1. public AppBoxDatabaseInitializer()
  2.         {
  3.             AutomaticMigrationsEnabled = true;
  4.             ContextKey = "AppBox.AppBoxContext";
  5.         }
复制代码

2、Global.asax.cs中Application_Start方法修如下:

原代码:
  1. Database.SetInitializer(new AppBoxDatabaseInitializer());
复制代码
修改为:
  1. Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppBoxContext, AppBoxDatabaseInitializer>());
复制代码

关于EF数据迁移的具体使用方法请自行百度 Entity Framework Migrations{:soso_e104:}{:soso_e104:}
发表于 2014-3-3 15:31:11 | 显示全部楼层
按照你这样的改法,每执行一次程序都会重新多出很多数据

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
 楼主| 发表于 2014-3-5 11:21:26 | 显示全部楼层
本帖最后由 SwordElf 于 2014-3-5 11:22 编辑
◆◇_提拉米苏℡ 发表于 2014-3-3 15:31
按照你这样的改法,每执行一次程序都会重新多出很多数据

AppBoxDatabaseInitializer 中的 Seed 方法中在Seed数据之间加个判断:

  1.             IQueryable<Config> configs = context.Configs;
  2.             //如果有数据,则停止Seed
  3.             if (configs.Any())
  4.             {
  5.                 return;
  6.             }
复制代码
 楼主| 发表于 2014-3-5 11:29:26 | 显示全部楼层
当然,还有一个方法就是“AddOrUpdate”,但是这个方法对与有ID的好像有问题,仍然会重复添加,方法如下:
  1. context.Configs.AddOrUpdate(new Config());
复制代码

所以我推荐用if判断。
发表于 2015-6-12 16:50:36 | 显示全部楼层
为什么删除字段时,报
  1. Automatic migration was not applied because it would result in data loss. Set AutomaticMigrationDataLossAllowed to 'true' on your DbMigrationsConfiguration to allow application of automatic migrations even if they might cause data loss. Alternately, use Update-Database with the '-Force' option, or scaffold an explicit migration.
复制代码

这错误
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-3-29 09:13 , Processed in 0.057477 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表