四个命令我们就不说了,说一下自动迁移和手动迁移的区别:
将Migration下的Configuration.cs文件中的AutomaticMigrationsEnabled 改为True,即开启了migration的自动迁移,自动迁移开启后,你输入命令update-database。发下程序会自动生成一个201403030033_AtuoMigration.cs的迁移文件,这个文件你从Migrations文件夹中是看不到的。说白了自动迁移就是程序会自动比较数据库,然后将代码中的改变,转换成数据库中的改变。
手动迁移就不用说了,add-migration +命名 就可以完成了,程序将在Migrations文件夹下生成相应的基架,用update-database即可以完成迁移。
了解完前面的问题,我们看看我遇到的问题。
运行程序的时候报错:
支持“EquipDBContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。
这个意思是数据库模型发生了改变,可是我已经用了迁移,为什么还会改变呢?我的数据库中有两张表,一张userinfoes,一张是Equipments,我打开数据库发现Equipments被删除了。
再次使用自动迁移,会有提示:自动迁移未应用,有可能会导致数据丢失。加上-force强制执行后,Equipments出现了,但是UserInfoes又被删除了,反复就是删除这张,新增那张。
不用自动迁移,改为手动,生成的迁移基架,up和down方法都是空的,换言之,程序认为没有必要更新数据库。
神马原因呢?
找到我们的model中,我的model都是按照网上教程来写的Equipment.cs包括了equipment类,还有继承自 DbContext 的EquipDBContext;UserInfo.cs包括了UserInfo和继承自 DbContext的UserDBContext。
你发现问题了么?对的,我们有两个DbContext,但是指向的都是同一个数据库。当更新EquipDBContext的时候,Migration认为userInfoes的表是多余的,所以就把它给删了。UserDBContext也是如此。
到此我们才发现是被晚上的教程给坑了,正确的model类的写法是,建立一个Shared.cs的文件,将DbContext内容写到一个文件夹中,并命名为 工程名+DbContext:
代码如下 | 复制代码 |
1 namespace LQMS.Models 2 { 3 public class LQMSDBContext : DbContext 4 { 5 public LQMSDBContext() 6 : base("DefaultConnection") 7 { 8 9 } 10 public DbSet<UserInfo> UserInfos { get; set; } 11 public DbSet<Equipment> Equipments { get; set; } 12 } 13 } |
这样子我们就只拥有一个LQMSDBContext设备上下文,Migration就可以准确的识别改变了!
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔