EF Core 迁移失败、数据丢失 手动处理

news2024/9/21 18:51:07

一、环境

        windows 10

        Visual studio 2022

        dotnet 6.0.404

        Microsoft.EntityFrameworkCore.Tools 6.0.14

二、问题

        有一记录房产交易数据的实体,已有生产数据,现需更改、添加字段,产生了迁移不成功和数据丢失的问题。

        原实体定义

  //唯一复合索引
  [Index(nameof(Name), nameof(TradeDay), IsUnique = true)]
  public class HouseTrade
  {
      [Key]
      [Required]
      public int HouseTradeID { get; set; }

      [Required]
      [MaxLength(100)]
      public string Name { get; set; }
      
      
      public int TotalTrades { get; set; }
      //总面积
      public float TotalArea { get; set; }

      
      public int HouseTrades { get; set; }
      //其中住宅面积
      public float HouseArea { get; set; }
      
      [Required]
      [MaxLength(20)]
      public string TradeDay { get; } = DateTime.Now.ToShortDateString();

      public HouseTrade() 
      {
        
      }

      public string toString() 
      {
          return Name + "\t" + TotalTrades+ "\t" + TotalArea + "\t" + HouseTrades + "\t" + HouseArea+"\t"+TradeDay;
      }

  }

 

        现不再需要记录交易面积,仅简单描述 住宅面积-总面积 以字符串存储就可以。 现在模型中可以删去TotalArea、HouseArea,然后增加字段 Description =  HouseArea + '-' + TotalArea。现模型如下所示:

    //唯一复合索引
    [Index(nameof(Name), nameof(TradeDay), IsUnique = true)]
    public class HouseTrade
    {
        [Key]
        [Required]
        public int HouseTradeID { get; set; }

        [Required]
        [MaxLength(100)]
        public string Name { get; set; }

        public int TotalTrades { get; set; }
        //public float TotalArea { get; set; }

        public int HouseTrades { get; set; }
        //public float HouseArea { get; set; }
        [MaxLength(200),AllowNull]
        public string Description { get; set; }

        [Required]
        [MaxLength(20)]
        public string TradeDay { get; } = DateTime.Now.ToShortDateString();

        public HouseTrade() 
        {
           
        }

        public string toString() 
        {
            return Name + "\t" +  TotalArea + "\t" + HouseTrades + "\t" +Description+"\t"+TradeDay;
        }

    }

        此时若直接用update-database,则原有数据将丢失,所以在生成迁移后,用手动进行更改以保护数据。 

三、解决办法

        在控制台执行Add-Migration 。

PM> Add-Migration addDescription
Build started...
Build succeeded.
An operation was scaffolded that may result in the loss of data. Please review the migration for accuracy.
To undo this action, use Remove-Migration.

默认在Migrations文件下会生成二个文件。

打开20230915024552_addDescription.cs文件,可以看到迁移将要进行的操作,若此时立即操作,原有TotalArea、TradeArea数据将丢失。

       protected override void Up(MigrationBuilder migrationBuilder)
       {
           migrationBuilder.DropColumn(
               name: "HouseArea",
               table: "HouseTrades");

           migrationBuilder.DropColumn(
               name: "TotalTrades",
               table: "HouseTrades");

           migrationBuilder.AddColumn<string>(
               name: "Description",
               table: "HouseTrades",
               type: "nvarchar(200)",
               maxLength: 200,
               nullable: false,
               defaultValue: "");
       }

此时手动修改代码,先创建Description字段,然后再将数据插入,然后再删除旧字段。

       protected override void Up(MigrationBuilder migrationBuilder)
       {

           migrationBuilder.AddColumn<string>(
               name: "Description",
               table: "HouseTrades",
               type: "nvarchar(200)",
               maxLength: 200,
               nullable: false,
               defaultValue: "");

           migrationBuilder.Sql(
               @"
               UPDATE HouseTrades
               SET Description = CONVERT(VARCHAR(30),HouseTrades) + '-' + CONVERT(VARCHAR(30),TotalTrades);
               ");

           migrationBuilder.DropColumn(
               name: "HouseArea",
               table: "HouseTrades");

           migrationBuilder.DropColumn(
               name: "TotalTrades",
               table: "HouseTrades");

       }

保存后再执行,update-database

PM> update-database
Build started...
Build succeeded.
Applying migration '20230915024552_addDescription'.
Done.

 数据迁移成功。

四、参考文章

管理迁移 - EF Core | Microsoft Learn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1013725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法——11.递归

这篇文章我们来讲一个很常用的算法思想——递归 目录 1.递归的概述 2.用递归求阶乘 3.用递归反向打印字符串 4.用递归来求解二分查找 5.用递归解决冒泡排序 6.用递归解决插入排序 7.用递归解决斐波那契数列 8.用递归解决兔子问题 9.用递归解决青蛙爬楼梯问题 10.递归…

CSS - 鼠标移入整行高亮显示,适用于会员套餐各参数对比页面(display: table,div 转表格形式)

效果图 可根据基础示例和进阶示例&#xff0c;复制进行改造样式。 如下图所示&#xff0c;本文提供 2 个示例。 基础示例 找个 HTML 页面&#xff0c;一键复制运行。 <body><h1 style"text-align: center;">基础示例</h1><section class"…

软件设计模式系列之六——单例模式

1 模式的定义 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这意味着无论何时何地&#xff0c;只要需要该类的实例&#xff0c;都会返回同一个…

JAVA高级技术入门(单元测试,反射,注解,动态代理)

JAVA高级技术入门&#xff08;单元测试&#xff0c;反射&#xff0c;注解&#xff0c;动态代理&#xff09; 一、Junit单元测试二、反射1.认识反射&#xff0c;获取类概念&#xff1a;快速入门&#xff1a;获取Class对象的三种方式 2.1获取类的构造器2.2获取类的构造器的作用&a…

计算机系统概述之计算机的发展历程

计算机系统概述之计算机的发展历程 计算机的发展历程计算机系统硬件的发展微处理器的发展 软件的发展CAD/ CAM/CIMS的简单介绍 思维导图总结 计算机的发展历程 计算机系统 计算机系统由硬件和软件组成。 硬件&#xff1a;指的是计算机实体&#xff0c;如&#xff1a;主机&#…

【深度学习】 Python 和 NumPy 系列教程(廿四):Matplotlib详解:2、3d绘图类型(10)3D箱线图(3D Box Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 0. 设置中文字体 1. 3D线框图&#xff08;3D Line Plot&#xff09; 2. 3D散点图&#xff08;3D Scatter Plot&#xff09; 3. 3D条形图&#xff08;3D Bar Plot&#xff09; 4. 3D曲面图…

动态规划——01背包

背包问题经典资料背包九讲&#xff0c;可以上网查一下相关资料。 下面的资料来自代码随想录和自己的一些个人理解&#xff0c;如有需要可以跳转代码随想录进行学习&#xff1a;代码随想录 (programmercarl.com) 背包一共分为01背包&#xff0c;完全背包&#xff0c;多重背包&am…

leetcode:70. 爬楼梯

一、题目 函数原型&#xff1a;int climbStairs(int n) 二、思路 此题运用递归思想。当只有1个台阶&#xff0c;那么只有1种方法爬到楼顶——跨一个台阶&#xff1b;当有2个台阶时&#xff0c;有2种方法爬到楼顶——跨一个台阶跨两次或直接跨两个台阶。当有3个台阶或更多台阶时…

实现客户端pineline的思路

背景&#xff1a; redis集群不支持客户端的mget操作&#xff0c;但是业务上对这个redis集群的批量操作的需求一直都在&#xff0c;所以有各种客户端实现了各式各样的pineline实现,本文就记录下我们公司的实现方式 pineline实现思路 1.pineline要快 pineline之所以快是因为可…

深度学习训练过程可视化工具

1.深度学习网络结构画图工具 地址&#xff1a;https://cbovar.github.io/ConvNetDraw/ 2.caffe可视化工具 输入&#xff1a;caffe配置文件 输出&#xff1a;网络结构 地址&#xff1a;http://ethereon.github.io/netscope/#/editor 3.深度学习可视化工具Visual DL Visual D…

数据变换:数据挖掘的准备工作之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

【毕设选题】flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计&#xff1a;每小时成交量2.2.1 创建 es 结果表&#xff0c; 存放每小时的成交量2.2.2 执行 sql &#x…

【python手写算法】numpy实现简易神经网络和反向传播算法【1】

import numpy as npdef dense(A,W):Znp.matmul(A,W)#矩阵乘法return 1/(1np.exp(-Z))if __name__ __main__:leanring_rate100Anp.array([[200.0,17.0]])# Wnp.array([[1,-3,5],# [-2,4,-6]])# bnp.array([[-1,1,2]])W1 np.array([[0., -10, 4],[-1,3,2]])W2np.ar…

数学建模__非线性规划Python实现

使用到的是scipy库 线性规划指的是目标模型均为线性&#xff0c;除此以外的都是非线性规划&#xff0c;使用scipy提供的方法对该类问题进行求解。 from scipy.optimize import minimize import numpy as np#定义目标函数 def fun(args):a,b,c,d argsv lambda x: (ax[0])/ (b…

免费和开源的机器翻译软件LibreTranslate

什么是 LibreTranslate &#xff1f; LibreTranslate 免费开源机器翻译 API&#xff0c;完全自托管。与其他 API 不同&#xff0c;它不依赖于 Google 或 Azure 等专有提供商来执行翻译。它的翻译引擎由开源 Argos Translate 库提供支持。 这个软件在 2022 年 3 月的时候折腾过&…

Vue 3的革命性新特性:深入了解Composition API

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

数据结构与算法——8.二分查找

这篇文章我们来讲一下数据结构与算法中的二分查找 目录 1.介绍 1.1背景介绍 1.2算法介绍 2.实现 3.几个问题 4.算法改进 4.1左闭右开版 4.2 平衡版 4.3 Leftmost版 4.4 Leftmost返回 i 版 5.小结 1.介绍 首先&#xff0c;我们来介绍一下二分查找 1.1背景介绍 需…

Marmof:AI写作助手文章内容生成器工具

【产品介绍】 名称 Marmof 具体描述 Marmof是一个AI驱动的写作平台&#xff0c;可以帮助你快速创建原创、无抄袭的网站、邮件、广告和博客内容。每月提供5000字的免费额度&#xff0c;永久有效。拥有超过49种强大的工具&#xff0c;可以为各种平台生成吸引人的内容…

界面组件DevExpress WinForms v23.1亮点 - 全新升级HTML CSS模板

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

Jupyter杂症二:目录不显示或展示不全

文章目录 序言一、问题表象二、解决及思考 有些问题&#xff0c;解法还真的是莫名其妙&#xff0c;就如同拍了一下电视机就好了。。。。。难道是在拍的时候&#xff0c;我们传了内力给了计算机&#xff1f; 序言 一、问题表象 二、解决及思考 用鼠标按住左键&#xff0c;在空…