如何使用 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
链接进行操作,因此产生了我的错误。
删除它后一切正常,无需其他调整。
我正在尝试创建一个当前拥有同一实体列表的实体,此 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
链接进行操作,因此产生了我的错误。
删除它后一切正常,无需其他调整。