Как заполнять динамические данные в конфигурации Entity Framework - PullRequest
0 голосов
/ 06 января 2019

У меня есть следующий метод расширения для заполнения данных:

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" }
    );

1 Ответ

0 голосов
/ 06 января 2019

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" }, 

Цитирование Документы о заполнении данных .

Значение первичного ключа необходимо указывать, даже если оно обычно генерируется базой данных. Он будет использоваться для обнаружения изменений данных между миграциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...