簡體   English   中英

如何在Entity Framework配置中播種動態數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM