FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

搜索
查看: 8525|回复: 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-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判断。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-6 15:25 , Processed in 0.047988 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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