如何强制 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);
}
}
所以我在 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);
}
}