EF Core 3.1 在 Sqlite 内存数据库中创建视图用于测试。

9
我正在使用EF Core 3.1为SqlServer构建数据库模型。我还使用EF生成的迁移文件来处理数据库更改。根据微软文档中的描述,为了进行测试,我正在启动内存中的Sqlite关系数据库:https://learn.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite
在我向数据库添加视图后,所有测试都按预期运行,根据此文档:https://learn.microsoft.com/en-us/ef/core/modeling/keyless-entity-types
根据微软文档的示例,测试应该类似于:
[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(); 确保数据库已创建,它会根据 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");
        });
}

我手动修改了迁移文件,使用原始SQL语句创建视图,在SqlServer上可以运行。但是,似乎context.Database.EnsureCreated();方法在创建数据库时忽略了迁移文件。

任何帮助将不胜感激。


8
真希望这个问题有个答案。 - TJ L
1
我们在.NET5和SQLite中遇到了相同的问题。视图根本没有被创建。我们的临时解决方法是使用RAW SQL手动创建视图。这意味着首先我们创建数据库 (context.Database.EnsureCreated()),然后执行RAW SQL (context.Database.ExecuteSqlRaw(<sql>))。我们没有那么多的视图,并且我们不希望在这里有太多更改,但如果可能的话,我们想避免这种解决方法,因为它会增加维护工作量。 - Thomas Purrer
遇到同样的问题,没有找到任何解决方案。谢谢@ThomasPurrer,你的解决方法真的有效。 - Irfan Soetedja
1个回答

1

基于我的广泛研究和测试,我不得不说不行。节省时间和挫败感。

在EF Core + SQLite中,视图不是支持的功能,即使您通过原始SQL脚本自己注入它们也不行。我进行了非常广泛的故障排除,但它根本不起作用。

MediatR和AutoMapper的作者Jimmy Bogard在this文章中写到了内存提供程序的问题,最终我不得不同意他的观点。我基本上以艰难的方式发现了相同的问题。

顺便说一句:如果您认为“好吧,我将切换到SQLite文件”,这也不会有太大帮助。许多事情变得复杂(DI中的DB提供程序数量,第三方库(如Jimmy的Respawn)的支持,DbFile上的竞争条件)。

这里的强大解决方案是Docker和容器中的数据库。将您的精力投入到这种方法中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接