如何强制 nHibernate 自动更新引用对象?

How to force nHibernate to update referencing objects automaticly?

所以我在 sqlite 中得到了两个流畅的 nHibernate 表:

public class Product
{
    public virtual long Id { get; set; }
    public virtual Exchange Exchange { get; set; }
}

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id);
        References(x => x.Exchange);
    }
}   

public class Exchange
{
    public Exchange()
    {
        Products = new List<Product>();
    }
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Product> Products { get; set; }

}

public class ExchangeMap : ClassMap<Exchange>
{
    public ExchangeMap()
    {
        Id(x => x.Id);
        Map(x => x.Name).Unique();          
        HasMany(x => x.Products)
          .Inverse()
          .Cascade.All();

    }
}   

我这样设置产品的交换:

using (var transaction = m_DbSession.BeginTransaction())
{
    try
    {
        var exchanges = (from p in m_DbSession.Query<Exchange>() select p).ToList()
        product.Exchange = (from p in exchanges
                            where p.Name == exchangeName
                            select p).FirstOrDefault();
    }
    catch (Exception ex)
    {
        new ExceptionDialog(ex, "Set Exchange").Show();
    }
    
    m_DbSession.SaveOrUpdate(m_DBProduct);
    transaction.Commit();
}

Sqlite 数据库已更新,但 Exchange 似乎未正确更新,因为当我想这样做时:

var notCorrect = (from ex in m_DbSession.Query<Exchange>() orderby ex.Name select ex).ToList();
Debug.WriteLine(notCorrect[0].Products.Count);

新产品未添加到 'exchange-side' 交易未重新提交。这意味着产品数量为 0(1 是正确的)。

当我重新启动我的程序时,一切都是正确的。

那么,为什么我的 Exchange 的内容在不重新启动的情况下不更新?

当我在这样的交易中自己更新我的交易所的产品列表时:

product.Exchange.Products.Add(product);

它也有效。但这不可能是答案,不是吗?我认为必须有一种方法可以强制 nHibernate 自行更新其引用?

如果问题不清楚请问我。我不是母语人士,所以我很难解释一切。我会更新问题。

What's the best way to refresh entities in nhibernate 的帮助下,我发现我的问题的解决方案是。它的:

Session.Refresh

因此,我处理相关 Exchange Product-List 的方法是在保存并提交产​​品后调用 Session.Refresh。像这样:

private void Save()
{
    using (var transaction = m_DbSession.BeginTransaction())
    {
        m_DbSession.SaveOrUpdate(product);
        transaction.Commit();
        m_DbSession.Refresh(product);
    }
}