【发布时间】: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