自己造轮子是一件苦差事。 现在,您可以专注于业务开发,仅需集成 ⭐️Furion⭐️ 即可。
Skip to main content

9.21 实体种子数据

特别提醒

一旦定义了种子数据或改变了种子数据,需要重新执行 Add-MigrationUpdate-Database 命令。

9.21.1 什么是种子数据

Furion 框架中,种子数据通常指的是通过程序为数据库预先设置一些初始化数据,比如我们的数据字典表,我们可能希望在系统构建初期就自动将一些规范化数据保存到数据库中。

如性别:男/女,地区,行业信息等等。

9.21.2 如何配置

Furion 提供非常灵活方便的 IEntitySeedData<TEntity> 依赖接口可以快速的构建种子数据,支持任何无参构造函数对象类中使用。如我们需要为 Person 表插入初始化数据:

9.21.2.1 在实体定义中使用

using Furion.DatabaseAccessor;
using System;
using System.Collections.Generic;

namespace Furion.Core
{
public class Person : EntityBase, IEntitySeedData<Person>
{
public string Name { get; set; }

public int Age { get; set; }

public string Address { get; set; }

// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}
特别注意

主键 值必须手动插入,因为会自动关闭主键或自增标识检查。

9.21.2.2 在任意对象类中使用

using Furion.DatabaseAccessor;
using System.Collections.Generic;

namespace Furion.Application
{
public class PersonSeedData : IEntitySeedData<Person>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

9.21.3 导航属性

通常我们的实体有 一对多多对多等外键关系,那么我们需要单独为每一个实体添加数据种子,而不是直接写在主表中。

9.21.4 多个数据库种子数据

Furion 提供泛型的方式支持多个数据库种子数据设定,如:

using Furion.DatabaseAccessor;
using System.Collections.Generic;

namespace Furion.Application
{
public class PersonSeedData : IEntitySeedData<Person, MySqlDbContextLocator, SqliteDbContextLocator>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

上面的例子表示同时为 MySqlDbContextSqliteDbContext 创建种子数据。

9.21.5 反馈与建议

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 数据种子 知识可查阅 EF Core - 数据种子设定 章节。