Я использую 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();
игнорирует файлы миграции при создании базы данных.
Любая помощь приветствуется.