简体   繁体   English

如何在Entity Framework配置中播种动态数据

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM