Can';如果多个实体引用同一个源,则在Nhibernate中级联删除或更新

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-正在充电操作(左表) 分布映射

我有ChargeOperations(左表)和Distributions(右表)的映射:

ChargeOperations的代码映射如下所示:

 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();
        }
    }