吵吵   2014-04-13  阅读:2,397

玩mvc不用entity framework就很可惜,用了EF框架不用code first更加可惜。migration虽然只有简答的四个命令,但是确实令我头大!

四个命令我们就不说了,说一下自动迁移和手动迁移的区别:

将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:

namespace LQMS.Models
{
    public class LQMSDBContext : DbContext
    {
        public LQMSDBContext()
            : base("DefaultConnection")
        {

        }
        public DbSet<UserInfo> UserInfos { get; set; }
        public DbSet<Equipment> Equipments { get; set; }
    }
}

这样子我们就只拥有一个LQMSDBContext设备上下文,Migration就可以准确的识别改变了!

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

3条回应:“EF中migration老是删错表”

  1. 推荐观看“触不可及”法国

发表评论

电子邮件地址不会被公开。 必填项已用*标注