[英]How to prevent data loss when I want to update database by using db-migration?
When I was making update my database by using db-migration, I faced a problem that was 当我使用db-migration更新我的数据库时,我遇到了一个问题
Automatic migration was not applied because it would result in data loss.
(I used System.ComponentModel.DataAnnotations
such as [Required]
and [StringLength(25)]
for some properties. For example Title
property.) (对于某些属性,我使用了System.ComponentModel.DataAnnotations
,如[Required]
和[StringLength(25)]
。例如Title
属性。)
I know if I set the AutomaticMigrationDataLossAllowed
to true
and Update-Database -Force
, my database will be update but my data will be removed and I'm going to prevent from it. 我知道如果我将AutomaticMigrationDataLossAllowed
设置为true
并且Update-Database -Force
,我的数据库将会更新,但我的数据将被删除,我将阻止它。 I want to protect my data. 我想保护我的数据。
I've used Entity Framework 6.x 我使用过Entity Framework 6.x.
How can I solve this problem? 我怎么解决这个问题?
Configuration class: 配置类:
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)
{
}
}
}
Initial class: 初级课程:
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()
{
}
}
}
My DbContext: 我的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 ....
}
}
You can add sql to fix the data in a way that is acceptable to you. 您可以添加sql以您可接受的方式修复数据。 You need to ensure that the alter statements generated BY EF do not cause data loss. 您需要确保BY EF生成的alter语句不会导致数据丢失。
Use the Sql
method in a migration to run your own sql: 在迁移中使用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));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.