gpt4 book ai didi

c# - 在同一事务中删除和添加子实体混淆了 nhibernate

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:15 25 4
gpt4 key购买 nike

我遇到了经典错误:

'deleted object would be re-saved by cascade 
(remove deleted object from associations)[DrillingContracts.Domain.TrackedField#3216'

但有一个额外的转折,错误完全源于我正在删除一个实体并添加一个新实体。

我用这个方法清空了所有预先存在的 child

 public void RemoveChildren(TrackedNode parentNode)
{
foreach (TrackedField trackedField in parentNode.ChildNodes)
{
_trackedFieldRepository.Delete(trackedField);
parentNode.RemoveChildNode(trackedField);
}
}

然后紧接着添加新的

public virtual void AddTrackedChildFieldsToTrackedCell(
params TrackedField[] nodes)
{
foreach (var field in nodes)
{
if (IsPath(field.Name))
{
throw new InvalidTrackedFieldNameException(
"The value " + field.Name + " is not a valid tracked field name.");
}
field.Supplement = this;
_trackedFields.Add(field);
}
}

对于那些想知道存储库中发生了什么的人来说,我得到的最佳答案是神奇的。 10,000% 魔法。最初的开发者使用的是 NCommon。这两种方法都是从包装在 NCommon.UnitOfWork 属性中的方法调用的。

应该注意的是,每种方法都按其自身的预期执行。 (IE,没有字段可以删除添加作品,同样,没有字段可以添加删除作品。)

编辑

[HttpPost]
[UnitOfWork(Scope = FilterScope.Result)]
public ActionResult SaveEditMode(long id, AddTrackedRowViewModel model, string editMode, List<string> elementNames, string provisionData)
{
var supplement = _supplementCoordinator.GetSupplement(id);
var table = supplement.TrackedTables.First(x => x.Name == model.Name);

var valueAttributes = JsonSerializer.DeserializeFromString<List<ValueAttributeViewModel>>(provisionData);
foreach (var prop in valueAttributes)
{
supplement.Set(prop.Attribute, prop.Value, false);
}

var cell = table.TrackedRows.First(x => x.Ordinal == model.Ordinal).TrackedCells.First(x => x.Name == "Detail");
_supplementCoordinator.RemoveChildren(cell);

if (elementNames != null)
{
var childNodes = elementNames.Select((t, i) => new TrackedField(cell, t, i)).ToList();
supplement.AddTrackedChildFieldsToTrackedCell(childNodes.ToArray());
}


return SwitchEditMode(model, editMode, table);
}

回答

public void AddChildren(Supplement supplement, TrackedNode parentNode, params TrackedField[] nodes)
{
foreach (TrackedField trackedField in nodes)
{
parentNode.AddChildNode(trackedField);

}
supplement.AddTrackedChildFieldsToTrackedCell();
}

我没有将它们作为新权利添加到父节点,只是相关的补充。

最佳答案

只是为了完整性。消息“删除的对象将被重新保存..” 是由显式调用 session.Delete(instance) 引起的。

在这种情况下,我们只需要 1) 从旧的父集合中删除此类项目,以及 2) 将其附加到新的父集合中。级联映射和 session.Flush() 将正确更新数据库。

最后的注意事项:这样的“移动”必须在一个 session /事务中完成,以避免其他问题(例如,“行已被另一事务更新或删除...”)。

关于c# - 在同一事务中删除和添加子实体混淆了 nhibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21236055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com