当我想使用 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
设置为true
和Update-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 更新数据库时,如何防止数据丢失?的主要内容,如果未能解决你的问题,请参考以下文章
将 npm db-migrate 与 Elastic Beanstalk 一起使用
当我的颤振应用关闭时,如何更新我的 Firebase 数据?