Can';如果多个实体引用同一个源,则在Nhibernate中级联删除或更新
我有ChargeOperations(左表)和Distributions(右表)的映射: ChargeOperations的代码映射如下所示:Can';如果多个实体引用同一个源,则在Nhibernate中级联删除或更新,nhibernate,cascade,fluent,cascading-deletes,Nhibernate,Cascade,Fluent,Cascading Deletes,我有ChargeOperations(左表)和Distributions(右表)的映射: ChargeOperations的代码映射如下所示: HasMany(x => x.Distributions).Table("ShadowDistributions").KeyColumn("SourceId").Cascade.All().Inverse(); ShadowDistributions-是一个正确的表。x、 分发内容只是分发内容的列表(右表)。X-正在充电操作(左表) 分布映射
HasMany(x => x.Distributions).Table("ShadowDistributions").KeyColumn("SourceId").Cascade.All().Inverse();
ShadowDistributions-是一个正确的表。x、 分发内容只是分发内容的列表(右表)。X-正在充电操作(左表)
分布映射(右表)
所以,我只想从分布中删除一行(右表)。
应用程序会抛出不同的映射异常,如“由于资源失败,事务无法提交:已删除的对象将通过级联重新保存(从关联中删除已删除的对象)[ChargeOperation#58]”或“意外的行数:0;预期:1英寸,以此类推
我使用cascade创建实体,效果很好,但要删除,我必须
清除右表中的所有引用,然后分别保存所有类型的实体。否则,我会出错 但我想使用级联保存。我如何实现它 保存后可能出现的变体:
如果不希望删除任何引用的实体,请将级联更改为
Cascade.SaveUpdate()
在我看来,当您删除其中一个子项(发行版
)时,您不应该试图删除父项(ChargeOperations
)
例子
如果我尝试在级联模式下删除发行版,Nhibernate尝试删除所有实体,但不删除我需要的所有实体-只删除实体本身而不使用cascad。但是如果创建实体,我需要级联!没有帮助。这是我的第一个解决方案。{“已删除的对象将通过级联重新保存(从关联中删除已删除的对象)[ChargeOperation 58]”唯一有帮助的是,在保存之前在左表中为Source和Dest设置null…我不尝试删除parant(ChargeOperation)。仅限子项(发行版)。但如果家长没有孩子,我也会将其删除。但在当前情况下,所有家长都是活着的,因为他们有其他孩子。您需要从
ChargeOperations
中的集合中删除Distribution
。检查ChargeOperations
在删除后是否还有Distributions
Count是0删除ChargeOperations
我照你说的做。从集合中删除分发,从存储库中删除分发,更新chargeOperation存储库。然后收到错误消息。不明白为什么。@Artem我已经发布了一个我所说的示例。听起来你在做很多不必要的事情删除该子项。如果上述操作不适用于您,则您需要发布当前检索/更新这些实体的方式。
References(x => x.Source).Nullable().Column("SourceId").Not.LazyLoad();
References(x => x.Dest).Nullable().Column("Dest").LazyLoad().Fetch.Join().Cascade.All();
public SomeMethod()
{
using(ISession session = ... //Get my session from somewhere)
{
Distribution childToDelete = ... //Get the distribution to delete
ChargeOperation parent = ... //Get the parent of the distribution we are deleting
parent.Distributions.Remove(childToDelete);
//Since the parent is in session just flush the session to apply changes
session.Flush();
}
}