【问题标题】:EntityFrameworkCore FindAsync does not get inserted record without SaveChangesEntityFrameworkCore FindAsync 在没有 SaveChanges 的情况下不会插入记录
【发布时间】:2021-11-26 18:21:47
【问题描述】:

我有一个产品列表,并使用 FindAsync() 从数据库中获取他们的库存。如果FindAsync 没有得到记录,我将产品插入到带有InsertAsync() 的库存中。然后,如果我第二次为相同的产品 ID 调用 FindAsync(),我仍然没有获得 Stock 记录,并且我的代码第二次尝试将记录插入 Stock。我需要查找产品库存,如果存在库存,请更新库存数量。我怎样才能找到新插入的记录而不在 foreach 循环中调用 SaveChangesAsync()

foreach (var product in products)
{
    var stock = await stockRepository.FindAsync(product.Id);
    if (stock == null)
    {
        stock = new Stock(SequenceGenerator.Create(SequenceType.Default), product.Id, quantity);
        stock = await stockRepository.InsertAsync(stock);
    }
    else
    {
        stock.Quantity += quantity;
        stock = await stockRepository.UpdateAsync(stock);
    }                
    await uow.SaveChangesAsync();              
}

【问题讨论】:

  • 尝试使用 stock.Result==null(同步)
  • EF Core 中没有 InsertAsyncUpdateAsync。也没有uowRepository。除非您发布代码,否则我们无法猜测您自己的类会做什么。不过,EF Core 没有问题,也不需要任何“存储库”或“工作单元”包装器。 DbContext 已经是一个工作单元,一个 DbSet 已经是一个存储库。在调用SaveChanges 之前,DbContext 已经缓存了更改。此时,所有更改都使用单个内部事务进行持久化。 这就是 UoW 的工作方式。
  • 我可能错了,但我认为在 SaveChangeAsync 完成之前不会将任何内容保存到数据库中(因此可以找到)。 EF 是一个工作单元,直到 SaveChanges 完成后 UoW 才完成。您可以跟踪尚未提交的记录而无需费心查找它们,甚至可以进行子事务。
  • “一个 DbSet 已经是一个存储库” - 对于那些坚持在其上分层另一个存储库的人来说,这是值得重复的,因为他们刚刚了解了设计模式。
  • 您似乎使用了“通用存储库”模式,破坏了 EF Core 的存储库和 UoW 功能。 DbContext 已经跟踪实体(除非您禁用更改跟踪)。 DbSet.Find 在访问数据库之前将首先查找所有缓存的实体。

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


【解决方案1】:

不确定 InsertAsync() 或 UpdateAsync 在做什么,但您必须附加对象,然后将实体状态设置为添加或修改:

var attached = dbContext.Attach(stock);
attached.State = EntityState.Added;

或者

var attached =dbContext.Attach(stock);
attached.State = EntityState.Modified;

【讨论】:

  • 可能性不大。如果新对象具有默认 ID 值,dbContext.Update 会将对象附加为已添加。
【解决方案2】:

在 Abp 框架中向数据库中插入新对象时,您应该始终添加布尔值 stockRepository.InsertAsync(stock, true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2013-11-18
    • 2017-01-17
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多