四个命令我们就不说了,说一下自动迁移和手动迁移的区别:
将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就可以准确的识别改变了!
我最强舞者 (I, Best Dancer)安卓版v8
我最强舞者(I, Best Dancer)是一款休闲放置类手
迷你世界国服版本2024 v1.43.0
迷你世界国服版本2024是一款自由度非常高的沙盒游戏,玩法和
烹饪乐园 安卓版v1.23.6
烹饪乐园(Cooking Town)是一款非常好玩的餐厅模拟
迷你世界小米服 最新安卓版v1.43.0
迷你世界小米版是由迷你玩科技开发的休闲模拟经营类游戏。此版本
布娃娃Sprunki沙盒 安卓版v0.0.1
布娃娃Sprunki沙盒是一个非常有趣的沙盒游戏,复古简约的