[英]How to seed dynamic data in Entity Framework configuration
I have the following extension method for seeding the data: 我有以下扩展方法来播种数据:
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"
});
}
}
Now, the generated key shall be passed as value to other table seed data. 现在,生成的密钥将作为值传递给其他表种子数据。
How do I get AuthorId
for below statements? 如何获得以下语句的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
enables IDENTITY_INSERT
. HasData
启用IDENTITY_INSERT
。 I have checked it debugging DataSeeding project: 我已经检查了它调试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
Then, for your data, the easy way is to inform PK's: 然后,对于您的数据,简单的方法是通知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" },
Quoting Data Seeding docs . 引用数据种子文档 。
The primary key value needs to be specified even if it's usually generated by the database. 即使通常由数据库生成,也需要指定主键值。 It will be used to detect data changes between migrations. 它将用于检测迁移之间的数据更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.