在带有.Net Core的内存数据库中,不向实体集合添加数据
Posted
技术标签:
【中文标题】在带有.Net Core的内存数据库中,不向实体集合添加数据【英文标题】:In Memory Database with.Net Core not adding data to entity collection 【发布时间】:2018-02-09 00:17:19 【问题描述】:我正在使用 EF Core 2.0.0 和 InMemory 2.0.0 创建 xunit 测试。我注意到实体没有被添加到上下文中。但是它被添加到 context..Local
下面是sn-p的代码
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 集合中?
【问题讨论】:
你能展示你的 UnitOfWork 课程吗?你的 unitOfWork.Commit() 是什么? 请阅读How to Ask并创建一个minimal reproducible example。 @hugorgor 我已经编辑了问题 你能把“new UnitOfWork”周围的“using”去掉吗? 仍然有同样的问题 【参考方案1】:内存数据库正在伪造一个测试替身。您当前的测试依赖于此测试替身中“DbSet<T>
属性”的实现细节。
我认为实现细节是为什么Set<T>()
就地工作的答案:
Assert.True(context.Set<Appointment>().Count == 1);
DbSet<T>
属性是为了方便,而不是实现数据访问。在上下文类中包含所有这些甚至不是强制性的(除非您在实体类中提供 导航属性)。
您也可以查看:Using DbContext Set<T>() instead of exposing on the context 进行澄清。
【讨论】:
【参考方案2】:在context.Appointment.Add(_appointment);
这一行之后,尝试在您的上下文中保存更改context.SaveChanges()
。我希望它会有所帮助。
【讨论】:
他在unitOfWork.Commit()
部分执行此操作。我知道这是您的第一个答案,因此可能会出错,但请在以后回答之前,确保您需要所有需要的信息,以便您的答案尽可能准确。以上是关于在带有.Net Core的内存数据库中,不向实体集合添加数据的主要内容,如果未能解决你的问题,请参考以下文章
带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何
在 ASP.NET Core Web API 中使用 Linq 避免实体重复
带有实体框架的 ASP.Net Core Web API 使用存储过程有啥好处吗? [关闭]
ASP .NET CORE 找不到带有自定义程序集的文件或程序集