【问题标题】:Repository does not update with saved changes by UnitOfWorks存储库不会随着 UnitOfWorks 保存的更改而更新
【发布时间】:2019-08-12 16:03:26
【问题描述】:

我正在使用带有 EF Core 2.1“代码优先”的 ASP.NET 样板。

我有一个函数,我传递一个拆分类型的参数。在这个函数中,我将首先检查这个 Split 是否存在于数据库中:

_liveEventRaceSplitRepository.FirstOrDefault(s => s.Id == split.Id)

如果为null,则插入,否则检查是否需要更新,如果需要更新。 第一次通话没有问题。数据库中不存在拆分,因此我将其插入:

_liveEventRaceSplitRepository.Insert(Split)

在下一次调用此函数时,将发送完全相同的拆分作为参数。问题是我的_liveEventRaceSplitRepository 不知道我刚刚插入了相同的拆分,所以当我打电话时

_liveEventRaceSplitRepository.FirstOrDefault(s => s.Id)

它仍然返回 null。

插入/更新/删除后如何更新存储库?

我在插入拆分后尝试使用_unitOfWorkManager.SaveChanges(),但没有任何区别。

我尝试将[UnitOfWork(isTransaction: false)] 放在函数/方法上方。

我试图通过在我的函数周围放置 using (var uow = _unitOfWorkManager.Begin()) { } 来为 unitOfwork 创建手动范围。

我尝试过的一切都没有任何改变。

LiveEventRaceSplit splitControl = _liveEventRaceSplitRepository.FirstOrDefault(sp => sp.Id == split.Id);
if (splitControl == null)
{
   _liveEventRaceSplitRepository.Insert(new LiveEventRaceSplit(raceId, split.Id, split.Name));
}
else if (splitControl.Name != s.Name) 
{
   splitControl.Map(s.Name);
   _liveEventRaceSplitRepository.Update(splitControl);
}     

_unitOfWorkManager.Current.SaveChanges();

我不知道最好的方法是什么,但我怎样才能实现我想要做的事情?

【问题讨论】:

  • 您是否检查过您的数据库是否包含插入的行? _unitOfWorkManager 的实现是什么?您是否检查过 Insert 或 Update 是否真的被击中? split中的Id是什么类型的?
  • @winters0:是的,我可以看到它在我的第一个Insert 上插入到数据库中,但是当我在第二次尝试时收到错误时,一切都回滚了,什么也没有。我没有对我的unitOfWorkManager 做任何额外的事情。我的构造函数中有这个IUnitOfWorkManager unitOfWorkManager 参数,我在同一个构造函数中设置了我的private IUnitOfWorkManager _unitOfWorkManager = unitOfWorkManager。我在拆分的 ID 只是一个普通的integer。我没有检查是否真的命中了 Insert 或 Update,但由于第一次尝试后它在数据库中,我猜是这样。
  • 在 GitHub 上创建一个从 aspnetboilerplate/module-zero-core-template 派生的 repro 项目。
  • @AmitJoshi,unitOfWorkManager 应该在范围完成后自动提交。
  • @JörgenGranefelt in abpboilerplate 或 ANZ 如果我们使用存储库模式获取实体记录以仅更新 UOW 方法中的一个属性,那么它是否应该在 UOW 方法完成/提交后自动更新 db 中的属性? Bcz r8 现在使用 repo 从 db 获取列表集合来更新一个属性,然后调用更新方法,例如:List<OnlineOrder> ordersToClose = _onlineOrderRepository.GetAll().where(...).ToList(); // Foreach loop to update status property. ordersToClose.ForEach(x => _onlineOrderRepository.Update(x)); 有没有更好的方法来实现这一点?谢谢

标签: c# ef-code-first repository unit-of-work aspnetboilerplate


【解决方案1】:

好的。我想我找到了解决方法。我不认为这是需要做的方式,但它确实有效。我认为存储库会处理这一切。无论如何,如果我导入using Abp.EntityFrameworkCore.Repositories;,我就可以访问我的存储库的 dbContext。因此,在我的插入之后,我调用:_liveEventRaceSplitRepository.GetDbContext().SaveChanges();,在我完成此操作之后,可以使用_liveEventRaceSplitRepository.FirstOrDefault(...); 找到插入的项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多