返回顶部
首页 > 资讯 > 精选 >Entity Framework Core种子数据Data-Seeding怎么配置
  • 272
分享到

Entity Framework Core种子数据Data-Seeding怎么配置

2023-06-29 16:06:05 272人浏览 薄情痞子
摘要

这篇文章主要介绍“Entity Framework Core种子数据Data-Seeding怎么配置”,在日常操作中,相信很多人在Entity Framework Core种子数据Data-Seedi

这篇文章主要介绍“Entity Framework Core种子数据Data-Seeding怎么配置”,在日常操作中,相信很多人在Entity Framework Core种子数据Data-Seeding怎么配置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Entity Framework Core种子数据Data-Seeding怎么配置”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一、什么是Data-Seeding

    Data-Seeding是EntityFrameworkCore 2.1以上版本新增加的特性。在项目刚开始的时候,我们往往是需要初始化一些基础数据到数据库中,通过Data-Seeding特性就可以实现这一功能。本篇文章我们将讲解如何进行数据初始化。

    二、初始化方法

    具体的数据初始化方法分为如下三种:

    • 模型中配置。这种是通过调用HasData()方法。

    • 手动迁移时添加。

    • 自定义初始化逻辑。

    下面我们分别来讲解如何使用这三种方式进行数据迁移。

    1、模型中配置

    这种方式是通过调用HasData()方法实现的。这种也是我在项目开发过程中,经常使用的。这种方式是在数据上下文类中重写OnModelCreating()方法,我们先看HasData()方法的定义:

    Entity Framework Core种子数据Data-Seeding怎么配置

    可以看到,方法的参数可以是Blog类型的数组,具体代码如下:

    using EFCore.Model;using Microsoft.EntityFrameworkCore;namespace EFCore.Data{    /// <summary>    /// 数据上下文    /// </summary>    public class EFDbContext:DbContext    {        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            optionsBuilder.UsesqlServer("Data Source=.;Initial Catalog=EFTest;User ID=sa;PassWord=123456;");        }        public DbSet<Blog> Blogs { get; set; }        /// <summary>        /// 重写OnModelCreating方法        /// </summary>        /// <param name="modelBuilder"></param>        protected override void OnModelCreating(ModelBuilder modelBuilder)        {            // 针对Blog实体添加种子数据            modelBuilder.Entity<Blog>().HasData(                new Blog()                {                    // Id字段要赋值,否则会报错                    Id=1,                    Name="ef core"                },                new Blog()                {                    Id=2,                    Name="asp.net Core"                },                new Blog()                {                    Id=3,                    Name="图解数据结构"                }                );            base.OnModelCreating(modelBuilder);        }    }}

    我们注意到:默认情况下会自动设置Id列为主键,并且是自动增长的。但是这里要设置Id的值,即使Id是自动生成的主键,否则会报下图所示的错误:

    Entity Framework Core种子数据Data-Seeding怎么配置

    添加完种子数据以后,我们运行程序,查看输出结果:

    Entity Framework Core种子数据Data-Seeding怎么配置

    查看数据库

    Entity Framework Core种子数据Data-Seeding怎么配置

    这样就生成了数据库和表,而且表里面也有了初始化数据。

    假如这时候我们想增加一条数据,代码如下:

    using EFCore.Model;using Microsoft.EntityFrameworkCore;namespace EFCore.Data{    /// <summary>    /// 数据上下文    /// </summary>    public class EFDbContext:DbContext    {        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=EFTest;User ID=sa;Password=123456;");        }        public DbSet<Blog> Blogs { get; set; }        /// <summary>        /// 重写OnModelCreating方法        /// </summary>        /// <param name="modelBuilder"></param>        protected override void OnModelCreating(ModelBuilder modelBuilder)        {            // 针对Blog实体添加种子数据            modelBuilder.Entity<Blog>().HasData(                new Blog()                {                    // Id字段要赋值,否则会报错                    Id=1,                    Name="ef core"                },                new Blog()                {                    Id=2,                    Name="ASP.net Core"                },                new Blog()                {                    Id=3,                    Name="图解数据结构"                },                // 新增加一条数据                new Blog()                {                    Id=4,                    Name="C#高级编程"                }                                );            base.OnModelCreating(modelBuilder);        }    }}

    这时候还能不能用刚才的方法呢?我们这时在运行程序,查看结果:

    Entity Framework Core种子数据Data-Seeding怎么配置

    这时候程序执行失败了,而且表里面的数据也没有增加。这说明context.Database.EnsureCreated()方法只有在第一次执行的时候才会有效,以后数据进行更改后就无效了。那么有什么方式可以实现呢?这时只有通过命令行进行迁移或者通过context.Database.Migrate方法调用生成的迁移类才能对数据的更改有效。

    我们把刚才生成的数据库删掉,新增加的那条数据注释掉,然后使用命令行迁移的方式生成数据库表,首先添加迁移:

    Entity Framework Core种子数据Data-Seeding怎么配置

    然后更新数据库:

    Entity Framework Core种子数据Data-Seeding怎么配置

    更新完数据库以后,我们在HasData()方法里面添加一条数据,然后再次执行上面的添加迁移和更新数据库的命令,发现这时候数据库里面会添加新增加的数据。

    在执行完第二次添加迁移命令后,如果不使用更新数据库命令,也可以通过代码的方式进行迁移,这就是调用context.Database.Migrate命令,代码如下:

    using EFCore.Data;using Microsoft.EntityFrameworkCore;using System;namespace EFCore.Con{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("Hello World!");            EFDbContext dbContext = new EFDbContext();            // 迁移            dbContext.Database.Migrate();            //bool tfTrue = dbContext.Database.EnsureCreated();            //if(tfTrue)            //{            //    Console.WriteLine("数据库创建成功!");            //}            //else            //{            //    Console.WriteLine("数据库创建失败!");            //}            Console.ReadKey();        }    }}

    这时会自动调用最新的迁移文件去更新数据库。

    注意:调用该方法对数据的更改只有在迁移时才能生效,也就是说只有通过命令进行迁移或者通过context.Database.Migrate方法调用生成的迁移类才能对数据更改有效。而调用context.Database.EnsureCreated()方法只有在第一次执行的时候才有效,但数据进行更改后将无效。

    这种方式有两种限制:

    • 必须指定主键的值(即使主键由数据库自动生成也要指定值)。

    • 添加的必须是静态数据,没有任何的依赖。比如添加的Id主键的值在其它表里面有引用就不可以。

    2、手动迁移时添加

    这种方式在这里不进行讲解,有兴趣的可以参考微软的官方文档。

    3、自定义初始化逻辑

    执行数据种子设定的一种简单而有效的方法是在主应用程序逻辑开始执行之前使用使用DbContext.SaveChanges()。代码如下:

    using EFCore.Data;using EFCore.Model;using Microsoft.EntityFrameworkCore;using System;using System.Linq;namespace EFCore.Con{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("Hello World!");            //EFDbContext dbContext = new EFDbContext();            //// 迁移            //dbContext.Database.Migrate();            ////bool tfTrue = dbContext.Database.EnsureCreated();            ////if(tfTrue)            ////{            ////    Console.WriteLine("数据库创建成功!");            ////}            ////else            ////{            ////    Console.WriteLine("数据库创建失败!");            ////}            #region 使用自定义初始化逻辑            using(EFDbContext context=new EFDbContext())            {                context.Database.EnsureCreated();                var testBlog = context.Blogs.FirstOrDefault(p => p.Name == "C#");                if(testBlog == null)                {                    // 添加数据                    context.Blogs.Add(new Blog()                    {                        Name = "C#"                    });                }                // 保存数据                context.SaveChanges();            }            #endregion            Console.ReadKey();        }    }}

    通过这种自定义逻辑的方式也可以添加种子数据。如果HasData()方法里面添加了种子数据,那么会先把HasData()方法里面的种子数据添加到数据库中。如果没有名称为C#的数据,则还会在添加一条数据。

    如果有了该数据,就不会再添加了。

    注意:这种方式新增数据的时候就不能再给主键Id赋值了,因为是先生成数据库,自动设置Id为主键,在添加数据的时候会自动赋值。

    三、Data-Seeding本质

    • 当调用HasData()方法首次迁移时,实质上是调用MigrationBuilder类中InsertData方法进行插入。

    • 当调用HasData()方法更改数据(未更改主键)时,实质上是调用MigrationBuilder类中UpdateData方法进行更新操作。

    • 当调用HasData()方法移除数据或更改主键时,实质上是调用MigrationBuilder类中DeleteData方法进行删除操作或者删除和更新操作。

    1、首次迁移

    我们在第一次执行完添加迁移命令以后,会生成一个迁移文件,如下图所示:

    Entity Framework Core种子数据Data-Seeding怎么配置

    可以看到这时就是调用的InsertData方法来新增数据。

    2、修改不是主键的数据

    我们修改数据,将ef core修改为ef core 3.1.1,如下图所示:

    Entity Framework Core种子数据Data-Seeding怎么配置

    修改完以后我们在执行迁移命令,如图所示:

    Entity Framework Core种子数据Data-Seeding怎么配置

    这时在去看生成的迁移文件:

    Entity Framework Core种子数据Data-Seeding怎么配置

    这时执行的就是UpdateData方法。

    3、删除数据

    接着我们把Id为1的数据在代码里面注释掉模拟删除操作,在执行迁移命令:

    Entity Framework Core种子数据Data-Seeding怎么配置在看生成的迁移文件:

    Entity Framework Core种子数据Data-Seeding怎么配置

    可以看到这次就是执行的DeleteData方法。

    4、修改主键数据

    我们在把Id为2的数据修改为6:

    Entity Framework Core种子数据Data-Seeding怎么配置

    在执行迁移:

    Entity Framework Core种子数据Data-Seeding怎么配置

    查看生成的迁移文件:

    Entity Framework Core种子数据Data-Seeding怎么配置

    这次就是先执行DeleteData方法,然后在执行InsertData方法。

    到此,关于“Entity Framework Core种子数据Data-Seeding怎么配置”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Entity Framework Core种子数据Data-Seeding怎么配置

    本文链接: https://lsjlt.com/news/325670.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Entity Framework Core种子数据Data-Seeding怎么配置
      这篇文章主要介绍“Entity Framework Core种子数据Data-Seeding怎么配置”,在日常操作中,相信很多人在Entity Framework Core种子数据Data-Seedi...
      99+
      2023-06-29
    • Entity Framework Core种子数据Data-Seeding
      目录一、什么是Data-Seeding二、初始化方法1、模型中配置2、手动迁移时添加3、自定义初始化逻辑三、Data-Seeding本质1、首次迁移2、修改不是主键的数据3、删除数据...
      99+
      2024-04-02
    • Entity Framework中怎么使用配置伙伴创建数据库
      这篇“Entity Framework中怎么使用配置伙伴创建数据库”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“E...
      99+
      2023-06-29
    • Entity Framework使用配置伙伴创建数据库
      在上一篇文章中讲了如何使用fluent API来创建数据表,不知道你有没有注意到一个问题。上面的OnModelCreating方法中,我们只配置了一个类Product,也许代码不是很...
      99+
      2024-04-02
    • 怎么使用ADO.NET Entity Framework构建数据访问层
      这篇文章主要介绍“怎么使用ADO.NET Entity Framework构建数据访问层”,在日常操作中,相信很多人在怎么使用ADO.NET Entity Framework构建数据访问层问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
      99+
      2023-06-17
    • vue中怎么使用assign重置data数据
      这篇文章主要介绍“vue中怎么使用assign重置data数据”,在日常操作中,相信很多人在vue中怎么使用assign重置data数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中怎么使用assig...
      99+
      2023-06-29
    • navicat怎么配置数据库
      navicat 数据库配置步骤:连接到数据库服务器(选择类型、输入连接信息)。创建或选择数据库(展开服务器节点,“创建数据库”或“刷新”)。设置数据库属性(右键单击数据库,“属性”)。创...
      99+
      2024-04-24
      mysql oracle navicat
    • vue的设置data数据不更新怎么解决
      随着前端技术的不断发展,Vue.js已经成为了很多前端工程师的首选框架。不过,在使用Vue.js的过程中,有时会遇到vue的设置data数据不更新的问题。本文将对这个问题进行分析,并提供解决方法。一、问题的具体描述在Vue.js中,我们可以...
      99+
      2023-05-14
    • Spring配置数据源的三种方式是什么
      这篇文章主要介绍“Spring配置数据源的三种方式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring配置数据源的三种方式是什么”文章能帮助大家解决问题。一、数据源的作用数据源(连接池)...
      99+
      2023-06-26
    • odbc怎么配置access数据库
      要配置ODBC连接到Access数据库,你需要按照以下步骤进行操作:1. 打开“控制面板”,然后选择“管理工具”。2. 在“管理工具...
      99+
      2023-09-22
      odbc access数据库
    • ssm怎么配置双数据源
      在 AWS Systems Manager (SSM) 中配置双数据源可以通过以下步骤完成:1. 登录 AWS 管理控制台并打开 S...
      99+
      2023-09-21
      ssm
    • java多数据源怎么配置
      在Java中配置多数据源可以通过以下步骤进行:1. 导入相关的依赖包,如`spring-boot-starter-jdbc`、`dr...
      99+
      2023-10-09
      java
    • springboot怎么配置多数据源
      在Spring Boot中配置多个数据源可以通过以下步骤来实现: 在pom.xml文件中添加Spring Boot对多数据源的支...
      99+
      2023-10-23
      springboot
    • WebLogic怎么配置JNDI数据源
      要配置JNDI数据源,你可以按照以下步骤进行操作: 打开WebLogic Server控制台,登录管理员账号。 导航到"域结构",...
      99+
      2023-10-23
      WebLogic
    • springboot怎么配置双数据库
      在Spring Boot中配置双数据库可以使用多个数据源。可以按照以下步骤进行配置:1. 在application.properti...
      99+
      2023-10-21
      springboot 数据库
    • springboot怎么配置双数据源
      在Spring Boot中配置双数据源,可以使用多个数据源的配置,并为每个数据源创建对应的Bean。以下是配置双数据源的步骤:1. ...
      99+
      2023-10-27
      springboot
    • springboot中怎么配置数据源
      在Spring Boot中配置数据源有以下几种方式:1. 使用默认的数据源配置:Spring Boot提供了默认的数据源配置,只需要...
      99+
      2023-10-27
      springboot
    • idea怎么配置mysql数据库
      要配置MySQL数据库,您可以按照以下步骤进行操作: 下载并安装MySQL数据库软件:您可以从MySQL官方网站下载MySQL数...
      99+
      2024-03-05
      idea mysql
    • 怎么配置MyBatis的数据源
      要配置MyBatis的数据源,首先需要在MyBatis的配置文件中指定数据源的信息。以下是一个示例配置文件: <xml ver...
      99+
      2024-03-07
      MyBatis
    • odbc怎么配置oracle数据源
      要配置ODBC连接到Oracle数据库,您需要按照以下步骤进行操作: 安装Oracle客户端 首先,您需要在计算机上安装Orac...
      99+
      2024-04-09
      odbc oracle
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作