最近我一直在为我的本地项目添加一些功能,而我正在努力解决这个问题.缺点是NHibernate给我的一句话:
Found shared references to a collection: Page.Menus
它的简单部分是,我只想保存将菜单绑定到页面的关系映射,您可以在下面的参考中看到它PageMap
.我应该补充一点,加载数据效果很好,这是拯救我的行为.
昨天我花了很多时间在这里挖掘,以及好的网络,试图找到答案,我只是一直在罢工.也许这对我来说很糟糕,但我觉得我尝试了一切.如果你知道它在哪里可以提供吗?(谢谢)
对于实际细节,我试图简化正在发生的事情.我添加了PageReposity,UnitOfWork和代理对象,以及它们的映射.
我朦胧的地方是级联,以及如何保存关系表(多对多)
对于第一部分,这是我保存(添加)时发生的情况.我实际上已经做了几个方法PageRepository
.因为我正在努力Add()
,我把它包括在这里:
public override bool Add(Page entity) { UnitOfWork.Save(entity); /* I have also tried doing the following below, which doesn't help for (var index = 0; index < entity.Menus.Count; index++) { UnitOfWork.Save(entity.Menus[index]); } */ UnitOfWork.Commit(); // bam, error! return true; }
在UnitOfWork
我设置的构造函数如下(在ISession的每次通过ninject注入像这样:
// DomainModule
...
Bind().To () .InSingletonScope() .WithConstructorArgument("connectionString", _connectWeb); ...
//回到 UnitOfWork
... private ISession Session { get; set; } ... public UnitOfWork(ISFactory sessionFactory) { _sessionFactory = sessionFactory.GetSessionFactory(); Session = _sessionFactory.OpenSession(); Session.FlushMode = FlushMode.Never; // I have also tried FlushMode.Commit _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted); } ... public void Save(object obj) { Session.Save(obj); } ... public void Commit() { if (!_transaction.IsActive) { throw new InvalidOperationException("Oops! We don't have an active transaction"); } try { _transaction.Commit(); Session.Flush(); // I did this FlushMode.Never was set } catch (Exception exception) { _transaction.Rollback(); throw; } }
我在这里有3节课:
Page
,Menu
和Link
.
public class Page : IEntity{ public virtual int Id { get; set; } public virtual IList
然后我也有一个映射:
public class PageMap : ClassMap{ public PageMap() { Id(x => x.Id).GeneratedBy.Native(); HasManyToMany(x => x.Menus) .Table("MenuToPage") .ParentKeyColumn("FkPageId") .ChildKeyColumn("FkMenuId").Cascade.SaveUpdate(); // the cascade is new here just trying to see if it helps } } public class MenuMap : ClassMap
任何人都可以帮助我或指出我的方向,我真的很感谢你的帮助.
总是谢谢你,
黄绿色
不幸的是,在安全之前,你已经发布了除了物体结构之外的所有东西.
如果将相同的实体集合分配给不同的实例,通常会发生此错误.例如(伪代码)
var menuList = new List<Menu>();... pageA.Menus = menuList; pageB.Menus = menuList;
这将设置menuList
两者的引用,pageA.Menus
和pageB.Menus
.
相反,将menuList
每个页面的所有项目分配给pageA.AddRange(menuList)
一个循环或其他...