gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:48 25 4
gpt4 key购买 nike

当我使用 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 ....
}
}

最佳答案

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

在迁移中使用 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));
}

关于database - 当我想使用 db-migration 更新数据库时如何防止数据丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com