当我想使用 db-migration 更新数据库时,如何防止数据丢失?

Posted

技术标签:

【中文标题】当我想使用 db-migration 更新数据库时,如何防止数据丢失?【英文标题】:How to prevent data loss when I want to update database by using db-migration? 【发布时间】:2014-12-16 13:06:40 【问题描述】:

当我使用 db-migration 更新我的数据库时,我遇到了一个问题

Automatic migration was not applied because it would result in data loss.

(对于某些属性,我使用了System.ComponentModel.DataAnnotations,例如[Required][StringLength(25)]。例如Title 属性。)

我知道如果我将AutomaticMigrationDataLossAllowed 设置为trueUpdate-Database -Force,我的数据库将被更新,但我的数据将被删除,我将阻止它。我想保护我的数据。

我用过 Entity Framework 6.x

我该如何解决这个问题?

配置类:

namespace Jahan.Blog.Web.Mvc.Migrations

   using System;
   using System.Data.Entity;
   using System.Data.Entity.Migrations;
   using System.Linq;

   internal sealed class Configuration 
    : DbMigrationsConfiguration<Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext>
   
       public Configuration()
       
           AutomaticMigrationsEnabled = true;
           AutomaticMigrationDataLossAllowed = false;
       

       protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context)
       

       
   

初始类:

namespace Jahan.Blog.Web.Mvc.Migrations

   using System;
   using System.Data.Entity.Migrations;

   public partial class Initial : DbMigration
   
       public override void Up()
       
       

       public override void Down()
       
       
   

我的 DbContext:

namespace Jahan.Blog.DataAccess

   public class JahanBlogDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole,    UserClaim>
   
       public JahanBlogDbContext()
           : base("name=JahanBlogDbConnectionString")
       

       
       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Comment>().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<UserRole>().ToTable("UserRole");
        modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
       
       // ... codes ....
   

【问题讨论】:

【参考方案1】:

您可以添加 sql 以您可以接受的方式修复数据。您需要确保 EF 生成的 alter statements 不会导致数据丢失。

在迁移中使用Sql 方法运行您自己的sql:

public override void Up()

    //Add this to your migration...
    Sql("UPDATE dbo.Table SET Name = LEFT(Name, 25) WHERE LEN(Name) > 25")

    //...before the code generated by EF
    AlterColumn("dbo.Table", "Name ", c => c.String(nullable: false, maxLength: 25));

【讨论】:

请指定我应该在哪里添加此代码?在哪个文件中? 您应该将它放在添加迁移时生成的迁移文件的Up 方法中,在对模型进行任何更改后必须这样做。 msdn.microsoft.com/en-gb/data/jj591621 您的评论很有用,我的数据库已更新。(我在 SqlServer 中看到数据库,一切正常)但是程序运行时出现错误......支持'的模型自数据库创建以来,JahanBlogDbContext 的上下文已更改。考虑使用 Code First 迁移来更新数据库 (go.microsoft.com/fwlink/?LinkId=238269)。 我从数据库中删除了 __MigrationHistory 表的记录。我的程序现在运行成功! 如果我想通过 db-migration 确定数据库中某个字段的值范围,应该怎么做? ...***.com/questions/26493019/…

以上是关于当我想使用 db-migration 更新数据库时,如何防止数据丢失?的主要内容,如果未能解决你的问题,请参考以下文章

node.js db-migrate 创建扩展问题

将 npm db-migrate 与 Elastic Beanstalk 一起使用

当我单击按钮时,我想更新数据库

当我的颤振应用关闭时,如何更新我的 Firebase 数据?

Grails db-migration dbm-db-doc 脚本失败

当我尝试从 firebase 更新数据时出错