EF Core 3.1 Создание представлений в базе данных Sqlite в памяти для тестирования - PullRequest
1 голос
/ 13 марта 2020

Я использую EF Core 3.1 для создания моих моделей баз данных для SqlServer. Я также использую сгенерированные EF файлы миграции для обработки изменений базы данных. Для тестирования я раскручиваю в памяти реляционную базу данных Sqlite, как описано в документации Microsoft: https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite.

Все мои тесты выполнялись, как и ожидалось, пока я не добавил Views в свою базу данных. , Согласно этой документации были добавлены представления: https://docs.microsoft.com/en-us/ef/core/modeling/keyless-entity-types.

На основании документации Microsoft пример теста должен выглядеть примерно так:

[Fact]
public void Add_writes_to_database()
{
    // In-memory database only exists while the connection is open
    var connection = new SqliteConnection("DataSource=:memory:");
    connection.Open();

    try
    {
        var options = new DbContextOptionsBuilder<BloggingContext>()
            .UseSqlite(connection)
            .Options;

        // Create the schema in the database
        using (var context = new BloggingContext(options))
        {
            context.Database.EnsureCreated();
        }

        // Run the test against one instance of the context
        using (var context = new BloggingContext(options))
        {
            var service = new BlogService(context);
            service.Add("https://example.com");
            context.SaveChanges();
        }

        // Use a separate instance of the context to verify correct data was saved to database
        using (var context = new BloggingContext(options))
        {
            Assert.Equal(1, context.Blogs.Count());
            Assert.Equal("https://example.com", context.Blogs.Single().Url);
        }
    }
    finally
    {
        connection.Close();
    }
}

строка context.Database.EnsureCreated(); обеспечивает создание базы данных. Он создает базу данных, таблицы и вставляет связанные данные; согласно указанному logi c в моем методе protected override void OnModelCreating(ModelBuilder modelBuilder).

Проблема в том, что не создает представление . Согласно документации; Это ожидаемое поведение.

Мой код для создания представления очень похож на пример кода:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<BlogPostsCount>(eb =>
        {
            eb.HasNoKey();
            eb.ToView("View_BlogPostCounts");
            eb.Property(v => v.BlogName).HasColumnName("Name");
        });
}

Я вручную изменил файл миграции, который создаст представление с использованием raw sql. И это работает на SqlServer, но, похоже, метод context.Database.EnsureCreated(); игнорирует файлы миграции при создании базы данных.

Любая помощь приветствуется.

...