c# - 如何在实体框架配置中播种动态数据
问题描述
我有以下用于播种数据的扩展方法:
public static class ModelBuilderExtensions
{
public static void Seed(this ModelBuilder modelBuilder)
{
//Key is GUID type and automatically generated on insert
modelBuilder.Entity<Author>().Property(x => x.Key).HasDefaultValueSql("NEWID()");
modelBuilder.Entity<Author>().HasData(
new Author
{
FirstName = "William",
LastName = "Shakespeare"
});
}
}
现在,生成的键应作为值传递给其他表种子数据。
我如何获得AuthorId
以下陈述?
modelBuilder.Entity<Book>().HasData(
new Book { BookId = 1, AuthorId = ?, Title = "Hamlet" },
new Book { BookId = 2, AuthorId = ?, Title = "King Lear" },
new Book { BookId = 3, AuthorId = ?, Title = "Othello" }
);
解决方案
HasData
启用IDENTITY_INSERT
. 我已经检查过它调试DataSeeding项目:
dbug: Microsoft.EntityFrameworkCore.Database.Command[20100]
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
IF EXISTS (SELECT * FROM [sys].[identity_columns]
WHERE [name] IN (N'BlogId', N'Url') AND
[object_id] = OBJECT_ID(N'[Blogs]'))
SET IDENTITY_INSERT [Blogs] ON; #<--- here
INSERT INTO [Blogs] ([BlogId], [Url])
VALUES (1, N'http://sample.com');
IF EXISTS (SELECT * FROM [sys].[identity_columns]
WHERE [name] IN (N'BlogId', N'Url') AND
[object_id] = OBJECT_ID(N'[Blogs]'))
SET IDENTITY_INSERT [Blogs] OFF; #<--- here
然后,对于您的数据,简单的方法是通知 PK:
modelBuilder.Entity<Author>().HasData(
new Author
{ Id = 1, //#<--- here
FirstName = "William",
LastName = "Shakespeare"
});
...
modelBuilder.Entity<Book>().HasData(
new Book { BookId = 1, AuthorId = 1, #<--- here
Title = "Hamlet" },
引用数据播种文档。
即使通常由数据库生成,也需要指定主键值。它将用于检测迁移之间的数据更改。
推荐阅读
- python - 遍历列表并在 Python 中找到匹配项
- tensorflow - Keras 检查点未保存到谷歌云存储桶
- hsqldb - 升级后 HSQLDB 命令行关闭不再起作用
- javascript - 在反应中更改循环内的especify css元素
- flutter - 在 Flutter 中将带有图像的对象本地存储在磁盘上的最佳方法?
- r - 如何通过 R 中的 dplyr 逐行选择 tibble 中的随机元素?
- java - Unicode ICU 而不是 java.time.DateTimeFormatter 应该用于国际日期和时间
- javascript - React 不更新状态的问题(钩子)
- php - TypeError: 传递给 PHPUnit\Framework\Assert::assertFileExists() 的参数 1 必须是字符串类型,给定 null,
- c - C编程练习