根据文件,
通常OnModelCreating()
仅在创建派生上下文的第一个实例时调用一次。然后,该上下文的模型将被缓存,并且适用于应用程序域中该上下文的所有其他实例。
现在考虑我的代码:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ApplyConfiguration(new StudentConfiguration());
}
internal class StudentConfiguration : IEntityTypeConfiguration<Student>
{
public void Configure(EntityTypeBuilder<Student> builder)
{
Console.WriteLine($">>>>>>>>>>>>>>>>>>>>>> {nameof(StudentConfiguration)}");
builder.HasData(
new Student
{
Name = "Albert Einstein",
Age = 100
},
new Student
{
Name = "Isaac Newton",
Age = 400
}
);
}
}
调用时dotnet ef database update
,调用播种。到目前为止,这是可以理解的。
现在如果我启动应用程序,OnModelCreating()
应该调用来创建模型,该模型将为应用程序域中数据库上下文的所有其他实例进行缓存。
我看到一个
>>>>>>>>>>>>>>>>>>>>>> StudentConfiguration
用于应用程序整个生命周期中的第一次数据库访问。
但是,我在数据库中没有看到重复的播种。
多次重新启动应用程序也不会导致多次播种。这实际上很好,但是播种一次怎么可能发生呢?Configure()
被调用多次,每个应用程序域每次调用一次?
HasData
Fluent API 是所谓 EF Core 的一部分模型数据种子 https://learn.microsoft.com/en-us/ef/core/modeling/data-seeding#model-seed-data。根据文档
与 EF6 不同,在 EF Core 中,种子数据可以与实体类型相关联,作为模型配置的一部分。然后,EF Core 迁移可以自动计算将数据库升级到模型的新版本时需要应用哪些插入、更新或删除操作。
Note
在确定应执行哪些操作以使种子数据进入所需状态时,迁移仅考虑模型更改。因此,在迁移之外对数据执行的任何更改都可能会丢失或导致错误。
这一切都意味着HasData
里面打电话OnModelCreating
被使用only用于生成迁移(并且仅在执行这些迁移时才应用于数据库)。它们对数据库上下文/模型/集/CRUD 操作的运行时行为没有影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)