深入Web框架-EF数据迁移常见问题

EF给大家带来了方便,但是也带来了麻烦,其自动迁移机制在某些方面不够灵活,显得有点呆板,比如我下面举出的几个方面,在Web开发框架中我们尽量避免使用EF的自动迁移。
问题1

EF禁用自动迁移

原因是我们禁用了EF的自动迁移,使用了AutomaticMigrationsEnabled = false;,解决方案将值赋为true就行了。

问题2

表重复

原因是我们后台用用SqL创建了表

CREATE TABLE [dbo].[InventorySerial1](
	[SerialID] [int] IDENTITY(1,1) NOT NULL,
	[SerialName] [nvarchar](max) NOT NULL,
    CONSTRAINT [PK_dbo.InventorySerial1] PRIMARY KEY CLUSTERED 
    (
	    [SerialID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
           ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

Web开发框架中我们使用了EF模型和表自动映射机制

 public class InventorySerial2Mapper : EntityTypeConfiguration<InventorySerial2>
 {
     public InventorySerial2Mapper()
     {
         HasKey(t => t.SerialID);
     }
 }

解决方案是我们不要用手动去创建模型对应的数据库表,如果有创建则删除。

EF命令手动迁移

在项目中使用Entity Framework的Code First模式,进行数据迁移时,Migration文件夹中存放的是每一次Entity的修改如何同步到数据的操作方法,每个文件中都只有Up和Down这两个方法。例如第一次数据迁移时,会创建数据表,在程序包管理控制台中输入命令:add-migration migrationname,会生成一个migrationname.cs的文件。再在程序包管理控制台中输入命令:update-database,即可将Entity的设计同步到数据库中,对应的Migration类文件的代码如下:

        public override void Up()
        {
            CreateTable(
                "dbo.InventorySerial1",
                c => new
                    {
                        SerialID= c.Int(nullable: false, identity: true),
                        SerialName= c.String(),
                    })
                .PrimaryKey(t => t.SerialID);
        }
        
        public override void Down()
        {
            DropTable("dbo.InventorySerial1");
        }

当后期对Entity进行了修改时,再次运行 add-migration migrationname 和update-database这两个命令,即可再生成一个同步文件,并将修改更新到数据库中,例如将Entity中的Year属性改为Years,生成的同步文件代码如下:

        public override void Up()
        {
            AddColumn("dbo.InventorySerial1", "Years", c => c.String());
            DropColumn("dbo.InventorySerial1", "Year");
        }
        
        public override void Down()
        {
            AddColumn("dbo.InventorySerial1", "Year", c => c.String());
            DropColumn("dbo.InventorySerial1", "Years");
        }

这里需要注意两个问题:
1、不能随意删除Migration文件夹内的同步文件,否则数据同步会失败。本人项目中多次进行Migration,但是将第一次创建数据表的Miragtion文件删除了,总是update-database失败,找了好半天才发现原因在这里。
2、每次add-Migration时取的文件名不能重名。命名时可以按照当天日期拼接当天的版本号组成,例如:20160514001,20160514002。

网站&系统开发技术学习交流群:463167176

本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,共创和谐网络环境。
转载请注明:文章转载自:华晨软件-云微开发平台 » 深入Web框架-EF数据迁移常见问题
本文标题:深入Web框架-EF数据迁移常见问题
本文地址:http://www.hocode.com/QAPrefecture/0009.html

相关文章: 深入MVC框架--EF中的导航属性优势与弊端(一) | 深入Web框架-EF数据迁移常见问题番外篇 | 深入MVC框架--EF中的导航属性优势与弊端(二)

电话
电话 18718672256

扫一扫
二维码