Kel*_*Dev 3 nhibernate fluent-nhibernate c#-4.0 asp.net-web-api
最近我一直在为我的本地项目添加一些功能,而我正在努力解决这个问题.缺点是NHibernate给我的一句话:
Found shared references to a collection: Page.Menus
Run Code Online (Sandbox Code Playgroud)
它的简单部分是,我只想保存将菜单绑定到页面的关系映射,您可以在下面的参考中看到它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;
}
Run Code Online (Sandbox Code Playgroud)
在UnitOfWork我设置的构造函数如下(在ISession的每次通过ninject注入像这样:
// DomainModule
...
Bind<ISFactory>().To<NHibernateSessionFactory>()
.InSingletonScope()
.WithConstructorArgument("connectionString", _connectWeb);
...
Run Code Online (Sandbox Code Playgroud)
//回到 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里有3节课:
Page,Menu和Link.
public class Page : IEntity<int>
{
public virtual int Id { get; set; }
public virtual IList<Menu> Menus { get; set; }
}
public class Menu : IEntity<int>
{
public virtual int Id { get; set; }
public virtual IList<Link> Links { get; set; }
}
public class Link : IEntity<int>
{
public virtual int Id { get; set; }
public virtual DateTime CreatedDate { get; set; }
public virtual string Url { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我也有一个映射:
public class PageMap : ClassMap<Page>
{
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<Menu>
{
public MenuMap()
{
Id(x => x.Id); // I had .GeneratedBy.Native(); attached here too.
HasManyToMany(x => x.Links)
.Table("MenuToLinks")
.ChildKeyColumn("FkLinksId")
.ParentKeyColumn("FkMenuId")
.OrderBy("MenuOrder ASC")
.Not.LazyLoad()
.Cascade.None(); // the cascade is new here just trying to see if it helps
}
}
public class LinkMap : ClassMap<Link>
{
public LinkMap()
{
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Url);
Map(x => x.CreatedDate);
Map(x => x.ModifiedDate);
References(x => x.MetaData, "FkMetaDataId").Not.Nullable().Not.LazyLoad();
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我或指出我的方向,我真的很感谢你的帮助.
总是谢谢你,
黄绿色
不幸的是,在安全之前,你已经发布了除了物体结构之外的所有东西.
如果将相同的实体集合分配给不同的实例,通常会发生此错误.例如(伪代码)
var menuList = new List<Menu>();...
pageA.Menus = menuList;
pageB.Menus = menuList;
Run Code Online (Sandbox Code Playgroud)
这将设置menuList两者的引用,pageA.Menus和pageB.Menus.
相反,将menuList每个页面的所有项目分配给pageA.AddRange(menuList)一个循环或其他...
| 归档时间: |
|
| 查看次数: |
1999 次 |
| 最近记录: |