对不起,但它是另一个:找到对集合的共享引用

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,MenuLink.

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)

任何人都可以帮助我或指出我的方向,我真的很感谢你的帮助.

总是谢谢你,

黄绿色

Mic*_*haC 6

不幸的是,在安全之前,你已经发布了除了物体结构之外的所有东西.

如果将相同的实体集合分配给不同的实例,通常会发生此错误.例如(伪代码)

var menuList = new List<Menu>();...

pageA.Menus = menuList;
pageB.Menus = menuList;
Run Code Online (Sandbox Code Playgroud)

这将设置menuList两者的引用,pageA.MenuspageB.Menus.

相反,将menuList每个页面的所有项目分配给pageA.AddRange(menuList)一个循环或其他...