[英]How to seed dynamic data in Entity Framework configuration
我有以下擴展方法來播種數據:
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" },
引用數據種子文檔 。
即使通常由數據庫生成,也需要指定主鍵值。 它將用於檢測遷移之間的數據更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.