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日

相关文章

  • 基于C#开发中的那些编码问题(详谈)

    基于C#开发中的编码问题 在C#开发中,编码问题是一个非常重要的话题。因为不同的编码会导致程序在不同环境中的表现不同,甚至会导致程序出现异常或崩溃。下面是基于C#开发中的几个常见编码问题。 1. 字符编码问题 在C#中,字符串是以Unicode编码的方式存储的,也就是说每个字符都是由两个字节表示的。然而,在不同的环境中,字符串的编码会出现不同的情况,比如在数…

    C# 2023年6月7日
    00
  • JQuery打造PHP的AJAX表单提交实例

    以下是“JQuery打造PHP的AJAX表单提交实例”的完整攻略,包括什么是AJAX表单提交、如何使用JQuery实现AJAX表单提交以及两个示例。 什么是AJAX表单提交? AJAX表单提交是指使用AJAX技术将表单数据提交到服务器,而无需刷新整个页面。AJAX表单提交可以提高用户体验,减少页面刷新次数,提高网站性能。 以下是使用AJAX技术提交表单的示例…

    C# 2023年5月15日
    00
  • 浅谈C#各种数组直接的数据复制/转换

    浅谈C#各种数组之间的数据复制/转换 在C#中,数组的复制和转换是开发中经常遇到的任务。对于不同类型的数组之间的复制和转换,有不同的方法。本篇文章将详细介绍C#中多种数组之间的数据复制和转换。 一、同类型数组的复制 1.1 直接使用复制方法 C#中同类型数组可以直接使用Array类的Copy方法实现数组数据的复制。 示例代码: int[] arr1 = ne…

    C# 2023年6月7日
    00
  • IIS7.5 Error Code 0x8007007e HTTP 错误 500.19的解决方法

    IIS7.5ErrorCode0x8007007eHTTP错误500.19是一种常见的IIS错误,通常是由于配置文件中的错误或缺失文件引起的。本文将介绍如何解决这个问题,并提供两个示例来演示如何使用这些技术。 解决IIS7.5ErrorCode0x8007007eHTTP错误500.19的方法 以下是解决IIS7.5ErrorCode0x8007007eHT…

    C# 2023年5月15日
    00
  • 采用C#代码动态设置文件权限

    关于采用C#代码动态设置文件权限的完整攻略,我们可以分为以下几个步骤来实现: 引用命名空间我们需要引用System.Security.AccessControl和System.IO命名空间,前者是用来操作文件、文件夹的访问控制列表(ACL),后者则用来操作文件或文件夹。 设置文件夹路径或文件路径设置需要控制权限的文件夹路径或文件路径。 string path…

    C# 2023年6月1日
    00
  • unity 如何使用LineRenderer 动态划线

    下面就来详细讲解“Unity 如何使用 LineRenderer 动态划线”: 1. 什么是 LineRenderer? 在 Unity 中,LineRenderer 是一个可以用来渲染简单的线段的组件,通常用于实现绘制不同的几何图形,例如:射线、路径、沿着路径的粒子效果等等。 2. 如何使用 LineRenderer? 在 Unity 中使用 LineRe…

    C# 2023年6月3日
    00
  • C# 内部类与Lambda表达式用法详解

    下面是“C# 内部类与Lambda表达式用法详解”的完整攻略: 1. C# 内部类 1.1 什么是内部类 在 C# 中,内部类又叫嵌套类,是指一个类定义在另一个类的内部。内部类可以访问外部类的成员,而外部类也可以访问内部类的成员。内部类可以使用 private、public、protected 和 internal 等访问修饰符,一般来说,内部类的访问修饰符…

    C# 2023年6月1日
    00
  • .NET实现可交互的WINDOWS服务的实例代码

    下面我将详细讲解如何在.NET中实现可交互的Windows服务,并提供两条示例说明。 1. 实现可交互的Windows服务的概述 通常,Windows服务是一种在后台运行的应用程序,不会在用户登录时启动并且没有用户界面。但有时,我们需要开发一种可交互的Windows服务,以便用户可以与其进行交互,并提供一些功能,例如控制自动任务的启动、停止以及查询自动任务的…

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