首页 > 其他分享 >EF Core 迁移代码

EF Core 迁移代码

时间:2023-09-21 14:33:06浏览次数:43  
标签:Core name EF migrationBuilder SQL table 迁移 FullName

列重命名

需要自定义迁移的一个重要示例就是重命名属性时。 例如,如果你将属性从 Name 重命名为 FullName,EF Core 将生成以下迁移:

migrationBuilder.DropColumn(
    name: "Name",
    table: "Customers");

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customers",
    nullable: true);

  EF Core 通常无法知道何时要删除列并创建新列(两个不同的更改),何时应对列重命名。 如果按原样应用上述迁移,你的所有客户名称都将丢失。 若要重命名列,请将上面生成的迁移替换为以下内容:

migrationBuilder.RenameColumn(
    name: "Name",
    table: "Customers",
    newName: "FullName");

  

提示

当某个操作可能会导致数据丢失(例如删除某列),搭建迁移基架过程将对此发出警告。 如果看到此警告,务必检查迁移代码的准确性。

添加原始 SQL

虽然可以通过内置 API 重命名列,但在许多情况下这是不可能的。 例如,我们可能想用一个新的 FullName 属性替换现有的 FirstName 和 LastName 属性。 EF Core 生成的迁移如下所示:

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

  如前所述,这会导致不必要的数据丢失。 为了从旧列传输数据,我们重新排列迁移并引入原始 SQL 操作,如下所示:

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

migrationBuilder.Sql(
@"
    UPDATE Customer
    SET FullName = FirstName + ' ' + LastName;
");

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

  

通过原始 SQL 进行任意更改

原始 SQL 还可用于管理 EF Core 不知道的数据库对象。 为此,请在不进行任何模型更改的情况下添加迁移;系统将生成一个空迁移,然后你可以使用原始 SQL 操作填充该迁移。

例如,以下迁移将创建一个 SQL Server 存储过程:

migrationBuilder.Sql(
@"
    EXEC ('CREATE PROCEDURE getFullName
        @LastName nvarchar(50),
        @FirstName nvarchar(50)
    AS
        RETURN @LastName + @FirstName;')");

  

 提示

当某个语句必须是 SQL 批处理中的第一个或唯一一个语句时,请使用 EXEC。 它还可以用来解决幂等迁移脚本中的分析程序错误,当表中当前不存在引用的列时,可能会发生此类错误。

这可用于管理数据库的方方面面,包括:

  • 存储过程
  • 全文搜索
  • 函数
  • 触发器
  • 视图

删除迁移

Remove-Migration 

列出迁移

Get-Migration

  

重置所有迁移

在某些极端情况下,可能需要删除所有迁移并重新开始。 这可以通过删除 Migrations 文件夹并删除数据库来轻松完成;此时,你可以创建一个新的初始迁移,其中将包含当前的整个架构。

你还可以重置所有迁移并创建单个迁移,而不会丢失数据。 此操作有时称为“更正”,涉及一些手动操作:

  • 删除 Migrations 文件夹
  • 创建新迁移并为其生成 SQL 脚本
  • 在数据库中,删除迁移历史记录表中的所有行
  • 在迁移历史记录中插入一行,以记录第一个迁移已经应用,因为表已经存在。 insert SQL 是上面生成的 SQL 脚本中的最后一个操作。

警告

删除 Migrations 文件夹后,所有自定义迁移代码都将丢失。 若要保留任何自定义项,必须手动将其应用到新的初始迁移。

标签:Core,name,EF,migrationBuilder,SQL,table,迁移,FullName
From: https://www.cnblogs.com/friend/p/17719866.html

相关文章

  • ASP.NET CORE区域LIS医学检验系统源码 SaaS模式B/S架构
    区域LIS系统源码 SaaS模式B/S架构的LIS系统源码区域LIS可促进基层医疗机构条码化检验业务管理,为基层搭建标本采集、标本核收、标本检验、室内质控、报告发布、统计分析的规范流程,同时为医疗机构提供检验诊断知识库提升检验业务水准。技术架构:ASP.NETCORE3.1MVC+SQLserver+R......
  • firefox浏览shtml时直接显示源代码问题
    firefox浏览shtml时直接显示源代码问题今天浏览网页时,打开一个网页http://photo.17ok.com/,发现直接显示了源代码,随之把页面补全,.php.html.htm都试过但都提示servernotfound,最后输入shtml,又一次出来了源代码。那么确定此页面属于.shtml页面。用IE浏览器打开,正常,无奈了,初步......
  • .netCore 图形验证码,非System.Drawing.Common
    netcore需要跨平台,说白点就是放在windows服务器要能用,放在linux服务器上也能用,甚至macos上。很多时候需要使用到图形验证码,这就有问题了。旧方案1.引入包<PackageReferenceInclude="System.Drawing.Common"Version="5.0.3"/>2.添加引用usingSystem.Drawing;usingSystem......
  • 三步实现BERT模型迁移部署到昇腾
    本文分享自华为云社区 《bert模型昇腾迁移部署案例》,作者:AI印象。镜像构建1.基础镜像(由工具链小组统一给出D310P的基础镜像)Fromxxx2.安装mindspore2.1.0,假定whl包和tar包已经下载到本地,下载地址:https://www.mindspore.cn/lite/docs/zh-CN/r2.0/use/downloads.htmlADD......
  • ref同步的数据属性
    代码码中存在一些重复部分,即两个地方都使用了<wo-work-order-form>组件。如果这两个地方的<wo-work-order-form>组件需要保持同步,那么应该使用同一个实例。可以通过在父组件中定义一个realForm的数据属性,并将其传递给两个地方的<wo-work-order-form>组件的ref属性,以达到同步的效果......
  • Fragment初学5——使用Fragment的子类PreferenceFragment
    在Android的应用中通常都有setting功能,能够设置一些全局的选项,例如字体颜色,个人喜好等等。这些东西都存在一个xml中,在android中对应的对象就是SharedPreferences。在android3.0之前,我们一般继承PreferenceActivity这个基类去实现相关的方法。在3.0之后的系统中当然选择使用Preferen......
  • 解析vue项目,scoped,ref属性,混入mixin,插件,Elementui
    0解析一下vue项目......
  • vue3的ref、reactive的使用
    一、介绍ref和reactive是Vue3中用来实现数据响应式的API,一般情况下,ref推荐定义基本数据类型,reactive推荐定义引用数据类型(对象或数组) 二、ref与reactive对比<template><p>{{person.name}}</p><p>{{person.long}}</p><p>{{age}}</p><p>{{info.addr......
  • IIS下部署asp.net core应用
    问题描述:IIS下部署asp.netcore应用,windows日志中经常发现如下重启信息:改善办法:每次某应用重启后,发现应用内的缓存都过期了,于是按照如下文章和以下截图将引用程序池做相应设置,该问题得到改善:主要是将启动模式改成:AlwaysRunning,将闲置时间改成0;参考文章:https://www.mo......
  • Ant Design Vue 中的tab组件中,获取不到$ref
    问题:在tab的组件中引入了一个组件,在页面渲染时,需要用到子组件bpmnModeler里面的方法,调用this.$ref.bpm的时候报错了,找不到bpm<a-tab-panekey="3"tab="流程图"><divclass="search"><a-card><a-rowstyle="positi......