如何使用 fluent-nhibernate 正确映射和更新自引用实体

How to correctly map & update a self referencing entity with fluent-nhibernate

我正在尝试创建一个当前拥有同一实体列表的实体,此 link 存在于另一个 table。

然后将其公开为 API。 我能够获取数据,但每次我尝试更新集合时,都会导致错误:a collection with cascade= all-delete-orphan was no longer referenced by the owning entity instance

public class MyEntity
{
   public virtual int Id { get; set; }
   public virtual ISet<MyEntity> LinkedEntities { get; set; }
}

我正在使用流畅的 nhibernate 自动映射,因此覆盖了默认映射。

var fluentConfigurationCampaign = Fluently.Configure()
.CurrentSessionContext("mySession")
.Database(
          MySQLConfiguration.Standard.ConnectionString(MyConnectionString)
        )
        .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<MyEntity>(cfg)
.Conventions.Setup(c => c.Add<CustomForeignKeyConvention>())
.Override<MyEntity>(map => map.HasManyToMany(i => i.LinkedEntities)
.ParentKeyColumn("EntitySelf")
.ChildKeyColumn("EntityOther")
.Table("Linked").Cascade.AllDeleteOrphan())

根据映射的建议,linked table 仅包含 3 个属性。

一个自己生成的ID

外键 EntitySelf linking 到实体 table

A foreignKey EntityOther linking 到实体 table。

更新实体时(通过控制器),我得到一个通过自动映射器映射到实体的 EntityContract。

然后我做:

_session.Merge(myEntityFromController);
var oldEntity = _session.Get<T>(myEntityFromController.Id);
_session.Update(oldEntity);
_session.Flush();

这对我所有的其他实体来说都很好。 但是,尝试更改 LinkedEntities 列表(通过删除、添加或什至不触摸它)时,出现错误:a collection with cascade= all-delete-orphan was no longer referenced by the owning entity instance

任何帮助将不胜感激,因为我被困在这个问题上了! 谢谢。

我的问题似乎与映射的 .Cascade.AllDeleteOrphan() 部分有关。 我以为它会引用我的 Linked table,但相反,它似乎试图对 MyEntity 链接进行操作,因此产生了我的错误。

删除它后一切正常,无需其他调整。