在带有.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&lt;T&gt; 属性”的实现细节

我认为实现细节是为什么Set&lt;T&gt;()就地工作的答案:

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

DbSet&lt;T&gt; 属性是为了方便,而不是实现数据访问。在上下文类中包含所有这些甚至不是强制性的(除非您在实体类中提供 导航属性)。

您也可以查看: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 找不到带有自定义程序集的文件或程序集

QueryString.Add 不向 ASP.NET Core 中的请求查询字符串添加值

带有 .NET EF Core 的内存缓存抛出错误