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

  发布于 2023-02-13 18:11

最近我一直在为我的本地项目添加一些功能,而我正在努力解决这个问题.缺点是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,MenuLink.

public class Page : IEntity
{
    public virtual int Id { get; set; }

    public virtual IList Menus { get; set; }
}

public class Menu : IEntity
{
    public virtual int Id { get; set; }

    public virtual IList Links { get; set; }
}

public class Link : IEntity
{
    public virtual int Id { get; set; }

    public virtual DateTime CreatedDate { get; set; }

    public virtual string Url { get; set; }
}

然后我也有一个映射:

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
{
    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
{
    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();
    }
}

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

总是谢谢你,

黄绿色

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

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

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

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

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

    2023-02-13 18:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有