在内存数据库中,.Net Core不向实体集合添加数据

时间:2017-08-31 06:32:24

标签: c# entity-framework .net-core xunit.net entity-framework-core

我正在使用EF Core 2.0.0和InMemory 2.0.0创建xunit测试。我注意到实体没有被添加到上下文中。然而,它正在上下文中添加。本地

以下是代码的片段

 public UnitOfWorkTest()
 {
   _appointment = new Appointment
   {
      AppointmentType     = AppointmentTypes.EyeTest,
      AppProgress         = Appointment.Confirmed,
      BranchIdentifier    = "MEL",
      DateAdded           = DateTime.Now,
      Duration            = 30,
      Resid               = "KAI",
    };

  }
public MyDbContext InitContext()
{
    var options = new DbContextOptionsBuilder<MyDbContext>()
                 .UseInMemoryDatabase("Add_writes_to_database")
                 .Options;

    return new MyDbContext(options);
 }

 public async Task UnitOfWork_Transaction_Test()
 {
     using (var context = InitContext())
     {
          using (var unitOfWork = new UnitOfWork(context))
          {
              context.Appointment.Add(_appointment);
              await unitOfWork.Commit();

              Assert.True(context.Appointment.Local.Count == 1);
           }
      }
 }

工作单元

public sealed class UnitOfWork : IUnitOfWork
{
    private IDbContext _dbContext;
    public UnitOfWork(IDbContext context)
    {

        _dbContext = context;
    }
    public async Task<int> Commit()
    {
        // Save changes with the default options
        return await _dbContext.SaveChangesAsync();
    }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    private void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_dbContext != null)
            {
                _dbContext.Dispose();
                _dbContext = null;
            }
        }
    }
}

IDbContext

 public interface IDbContext : IDisposable
    {
        DbSet<TEntity> Set<TEntity>() where TEntity : class;
        EntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
        EntityEntry Entry(object entity);
        Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken));
    }

context.Appointment始终返回空列表/ null但我可以在context.Appointment.Local

中看到添加的实体

知道为什么会这样吗?如何在Appointment集合中添加实体,而不是在Appointment.Local集合中添加?

2 个答案:

答案 0 :(得分:0)

在此行context.Appointment.Add(_appointment);之后尝试保存您的上下文context.SaveChanges()中的更改。我希望它会有所帮助。

答案 1 :(得分:0)

内存数据库伪造了 test double 。您当前的测试依赖于此测试双精度中“ DbSet<T>属性”的实施细节

我认为实施细节是为什么 Set<T>()在原地工作的答案:

Assert.True(context.Set<Appointment>().Count == 1);

DbSet<T>属性是为了方便起见,而不是实现数据访问。甚至没有必要在上下文类中全部包含它们(直到在实体类中提供导航属性为止)。

您还可以检查:Using DbContext Set<T>() instead of exposing on the context进行澄清。