实体框架核心 - 在内存提供者必填字段

时间:2016-02-12 02:05:26

标签: entity-framework-core effort

在以前版本的Entity Framework中,我一直在使用Effort(https://effort.codeplex.com/)进行单元测试。我决定为EF Core提供新的内存提供程序,并很快发现它不支持在OnModelCreating中设置的IsRequired()和其他实体配置。有没有办法让它尊重这种配置?如果没有,这是否在todo列表上实现?甚至可能是内存提供商的另一种选择?

我希望能够使用测试步骤来交换上下文,并在一些可以利用相同代码的集成测试场景中使用真正的数据库。这似乎是一个很好的拥有",也许这是EF Core努力的一个案例。我无法找到关于为EF Core工作的任何事情。

我无法在Uservoice页面上找到任何关于EF(https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions)的内容,如果它不可用,我会在那里找到。

1 个答案:

答案 0 :(得分:3)

这个问题在很长一段时间内被问到了,但我遇到了同样的问题并偶然发现了这个悬而未决的问题。我最终找到了一个对我有用的答案,所以我想我会分享,以防其他人像我一样碰到这个。

似乎SQLite有一个内存选项,它比标准的UseInMemory()选项更像真实数据库: https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite

唯一的区别是我添加了 Microsoft.EntityFrameworkCore.Sqlite ,而不像文档所说的那样 Microsoft.Data.Sqlite

与问题不完全相关,但在我的特定情况下,我想在内存中使用内存,而我正在测试我正在使用的webapi的基本功能,但我仍然希望能够测试唯一约束等。这是我为实现内存数据库而添加的内容。

在配置服务中:

services.AddDbContext<MyDbContext>(options =>
{
    var liteConn = new SqliteConnection("DataSource=:memory:");
    liteConn.Open();

    options
        .UseSqlite(liteConn)
        .ConfigureWarnings(warnings =>
        {
            warnings.Throw(RelationalEventId.QueryClientEvaluationWarning);
            warnings.Log(RelationalEventId.ExecutedCommand);
        });
});

在Configure:

if (env.IsDevelopment())
{
    var context = app.ApplicationServices.GetRequiredService<MyDbContext>();
    context.Database.EnsureCreated();
}