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



所以我在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);

新产品未添加到交易的"交换端",未表示。这意味着产品计数为0(1将是正确的)。

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

那么为什么我的exchange的内容不重新启动就不更新呢?

当我在交易中自己更新Exchange的Product-List时,如下所示:

product.Exchange.Products.Add(product);

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

如果问题不清楚,请问我。我的母语不是英语,所以我很难解释所有的事情。我会更新问题

借助What's在nhibernate中刷新实体的最佳方法,我发现我的问题的解决方案是。其:

Session.Refresh

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

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

最新更新