9.21 实体种子数据
特别提醒
一旦定义了种子数据或改变了种子数据,需要重新执行 Add-Migration
和 Update-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 = "广东省珠海市" }
};
}
}
}
上面的例子表示同时为 MySqlDbContext
和 SqliteDbContext
创建种子数据。
9.21.5 反馈与建议
与我们交流
给 Furion 提 Issue。
了解更多
想了解更多 数据种子
知识可查阅 EF Core - 数据种子设定 章节。