我正在使用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;
}
}
}
}
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集合中添加?
答案 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进行澄清。