Entity Framework Core种子数据Data-Seeding

Entity Framework Core 种子数据(Data Seeding)可以帮助开发者在应用程序中使用预定义的数据填充数据库。本篇文章将从概览、设计、实现等方面详细地介绍 Entity Framework Core 种子数据的完整攻略,包括,如何配置数据模型和 DbContext,如何添加种子数据,以及如何在应用启动时自动应用种子数据等。

1. 概述

Entity Framework Core 是一个轻量级、扩展、跨平台的 ORM(对象关系映射)框架,它支持从各种数据库引擎中存储和检索数据,例如 SQL Server、MySQL 和 SQLite。在 Entity Framework Core 中,种子数据是指使用代码的方式在数据库中预设数据,这些数据可以用于开发、测试或者演示。

2. 设计

Entity Framework Core 种子数据包括以下三个方面的设计:

数据模型设计

数据模型设计是指定义哪些实体和属性将成为数据表和数据库列。数据模型设计可以由 Entity Framework Core 的模型构建器、手工代码或者组合模型构建器和手工代码完成。

数据库上下文设计

数据库上下文是一个类,它维护和管理 Entity Framework Core 的数据库访问方式。数据库上下文中包含一个或多个 DbSet,其中每个 DbSet 表示数据库中的一个数据表。

在数据库上下文中配置种子数据的方法是在 DbContext 中,重写 OnModelCreating 方法,并使用 modelBuilder.Entity().HasData() 方法。

种子数据设计

种子数据是预先填充数据库表的一组数据。为了添加种子数据,必须创建一个对象的列表或数组。每个对象代表一个行,并且包含与该行关联的属性。可以针对每个实体创建种子数据,并将它们保存在数组中,然后使用 HasData 方法添加数据。

3. 实现

本节将详细说明如何配置数据模型和 DbContext、如何添加种子数据,以及如何在应用启动时自动应用种子数据。

配置数据模型和 DbContext

下面是一个简单的数据模型定义。其中 EmployeeDepartment 表表示公司中雇员和部门的信息。

public class Employee
{
    public int EmployeeId { get; set; }

    public string Name { get; set; }

    public Department Department { get; set; }

    public int DepartmentId { get; set; }
}

public class Department
{
    public int DepartmentId { get; set; }

    public string Name { get; set; }

    public ICollection<Employee> Employees { get; set; }
}

public class SampleDbContext : DbContext
{
    public SampleDbContext(DbContextOptions<SampleDbContext> options) : base(options)
    {
    }

    public DbSet<Employee> Employees { get; set; }

    public DbSet<Department> Departments { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Department>().HasData(
            new Department { DepartmentId = 1, Name = "IT" },
            new Department { DepartmentId = 2, Name = "Sales" },
            new Department { DepartmentId = 3, Name = "Marketing" }
        );

        modelBuilder.Entity<Employee>().HasData(
            new Employee { EmployeeId = 1, Name = "John Doe", DepartmentId = 1 },
            new Employee { EmployeeId = 2, Name = "Jane Doe", DepartmentId = 2 },
            new Employee { EmployeeId = 3, Name = "Jim Johnson", DepartmentId = 3 }
        );
    }
}

在上面的代码中,我们定义了两个实体类 EmployeeDepartment,并定义了一个数据库上下文 SampleDbContext。在 SampleDbContext 中,我们重写了 OnModelCreating 方法,并使用 modelBuilder.Entity().HasData() 方法,在数据库加载时添加了两个实体的种子数据。

添加种子数据

在 Entity Framework Core 中,添加种子数据有两种不同的方法:直接添加单条记录方法与通过 List 添加多条记录方法。

直接添加单条记录方法

对于单条记录,可以使用 HasData() 方法直接向数据表添加种子数据。以下是示例:

modelBuilder.Entity<Department>().HasData(
    new Department { DepartmentId = 1, Name = "IT" }
);

通过 List 添加多条记录方法

对于多条记录,需要使用 List<T> 将对象添加到列表中,然后在 DbContext 中引用该列表并使用 HasData() 一次性添加多条记录。以下是示例:

var departments = new List<Department>
{
    new Department { DepartmentId = 1, Name = "IT" },
    new Department { DepartmentId = 2, Name = "Sales" },
    new Department { DepartmentId = 3, Name = "Marketing" }
};

modelBuilder.Entity<Department>().HasData(departments);

在应用启动时自动应用种子数据

如果需要在应用启动时自动加载和应用种子数据,可以在 Program.cs 文件中重写 Main() 方法,在调用 CreateWebHostBuilder() 方法之后调用 CreateDefaultBuilder() 方法,然后使用 UseStartup<Startup>() 方法添加启动配置。使用 EnsureCreated() 方法来自动为数据库生成模式并添加种子数据。

以下是示例:

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args)
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseKestrel()
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<SampleDbContext>();
            context.Database.EnsureCreated();

            // Add seed data if database is empty
            if (!context.Employees.Any())
            {
                context.Employees.AddRange(
                    new Employee { EmployeeId = 1, Name = "John Doe", DepartmentId = 1 },
                    new Employee { EmployeeId = 2, Name = "Jane Doe", DepartmentId = 2 },
                    new Employee { EmployeeId = 3, Name = "Jim Johnson", DepartmentId = 3 }
                );
            }
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}

在上面的代码中,我们首先使用 CreateWebHostBuilder() 方法创建了一个 WebHost 对象,然后使用 CreateDefaultBuilder() 方法并添加了一个启动配置,最后使用 EnsureCreated() 方法自动为数据库生成模式并添加种子数据。

总结

本文详细介绍了 Entity Framework Core 种子数据的完整攻略。在设计 Entity Framework Core 种子数据时,需要考虑数据模型、数据库上下文和种子数据的设计。在实现种子数据时,我们可以使用直接添加单条记录方法和通过 List 添加多条记录方法来添加种子数据。最后,我们可通过重写 Main() 方法,在应用启动时自动应用种子数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Entity Framework Core种子数据Data-Seeding - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • .net的socket异步通讯示例分享

    下面我将为您详细讲解“.NET的Socket异步通讯示例分享”的攻略。 一、什么是Socket异步通讯 在计算机网络中,Socket(套接字)是指一个可以收发信息的网络通信端点,常用于客户端与服务器之间的通信。异步通讯是指通讯双方在任何时候都可以独立地发送和接收消息,不需要等待对方的响应。 在.NET中,可以使用Socket类实现Socket异步通讯,它提供…

    C# 2023年5月31日
    00
  • 垃圾代码二三行 ASPX小马

    攻击者可以通过嵌入”垃圾代码”来在服务器上运行恶意代码,从而达到控制服务器的目的。其中,”垃圾代码二三行 ASPX小马”是一种常见的攻击手段,本文将对其进行详细讲解。 什么是”垃圾代码二三行 ASPX小马” “垃圾代码二三行 ASPX小马”是指攻击者将一小段ASP.NET代码嵌入到页面中,通过这段代码来加载运行ASPX小马,从而达到控制服务器的目的。 攻击步…

    C# 2023年5月31日
    00
  • 深入解析C#编程中struct所定义的结构

    深入解析C#编程中struct所定义的结构 什么是struct? struct是C#语言中用来定义结构体的关键字,它像类一样可以定义成员变量和方法,但是,它有以下特点: struct是值类型,而类则是引用类型 在定义struct时,成员变量不会进行初始化,必须在创建实例时自行初始化 struct的实例通常存储在栈中,而类的实例存储在堆中 使用struct可以…

    C# 2023年6月7日
    00
  • C#获得文件属性信息的实现方法

    下面是C#获得文件属性信息的实现方法的完整攻略。 1.获取文件信息对象 要获取文件属性信息,需要先获取文件信息对象。C#中可以使用FileInfo类来获取文件信息对象,具体代码如下: FileInfo fileInfo = new FileInfo("test.txt"); 其中,test.txt是要获取属性信息的文件名,可以根据具体情况…

    C# 2023年6月1日
    00
  • C#中委托用法

    C#中委托是一种能够存储方法的一种类型。委托可以用来实现回调函数,事件处理程序和多路广播事件等。下面是C#中委托用法的完整攻略。 1.定义委托类型 在定义委托时,需要指定返回类型和参数列表,如下所示: delegate void MyDelegate(int x, int y); 表示MyDelegate是一种委托类型,接受两个int类型的参数,无返回值。 …

    C# 2023年6月1日
    00
  • C#操作INI文件的辅助类IniHelper

    C#操作INI文件的辅助类IniHelper INI文件是一种格式简单的配置文件,在Windows中被广泛应用。C#可以通过调用Win API函数来操作INI文件,但是操作起来比较繁琐。因此,使用辅助类IniHelper可以更加方便、简单地操作INI文件。 使用IniHelper IniHelper类封装了INI文件读、写等操作,使用前需要引入该类所在的命名…

    C# 2023年6月1日
    00
  • 基于C#实现的轻量级多线程队列图文详解

    基于C#实现的轻量级多线程队列 简介 本文将介绍如何使用C#实现一个轻量级多线程队列,用于在高并发场景下,实现多线程之间的任务分发,以提高程序的效率。该队列使用了ConcurrentQueue和ManualResetEvent两个工具实现。 实现步骤 创建一个实现了IDisposable接口的队列类ThreadQueue,并在该类中定义私有字段: priva…

    C# 2023年6月6日
    00
  • 带着问题读CLR via C#(笔记二)类型基础

    首先,你需要明确CLRviaC#是一本深入CLR和C#的书籍,针对读者提出了一系列问题,通过深入讲解各种类型的基础知识来解答这些问题。因此,想要完整掌握CLRviaC#,需要掌握以下几个步骤: 1. 阅读笔记前先阅读CLRviaC#原著 CLRviaC#是一本非常优秀的书籍,但它也是非常深入的一本书籍。为了能够真正理解笔记,你需要先阅读原著,并掌握其中的主要…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部