在制作产品的时候, 如果用户打开了一个产品界面,没有作任何操作,然后打开另外一个产品界面,制作完毕再保存,在进入产品审核的时候,会发出多了一条空白记录.
这种情况产生的原因是,前一次打开时新建了一个空白的产品.在提交的时候用到了SessionFactory.GetUnitOfWork.CommitChanges();
提交了所有更改,包括此次制作的产品和上一次没保存的产品. 而上次的空白产品我们是不希望保存的. 但是这个UnitOfWork又是全局共享的,怎么处理呢?
办法其实不止一个. 我举两例:
方法一:
你可以在产品制作界面,使用SessionFactory.CreateUnitOfWork()来新建一个UnitOfWork. 以后在所有的操作都在这个新建的UnitOfWork基础上进行.
但这种方法开销很大,不仅会增加数据库连接,还会使得在公共UnitOfWork中已有的对象,需要在新的会话中重新从数据库获取,
方法二:
这是我推荐的方法: 使用NestedUnitOfWork (嵌套的UnitOfWork)
NestedUnitOfWork的特性是组成了一个相对封闭的会话,它提交修改时,只对它上面创建的对象有效.
扫描二维码关注公众号,回复:
3642670 查看本文章
XpoProductArticleInfo Article;
NestedUnitOfWork nuow;
void CreateArticle(XpoProductInfo product)
{
//获取嵌套的UnitOfWork用于本次会话
nuow = SessionFactory.GetUnitOfWork().BeginNestedUnitOfWork();
Article = new XpoProductArticleInfo(nuow);
//如果用到了上层UnitOfWork的对象,需要转换一道,否则保存的时候会抛出"不在同一个会话"的异常
Article.ProductId = nuow.GetNestedObject<XpoProductInfo>(product);
}
void SaveArticle()
{
Article.ArtContent = RichEdit.DocumentBytes;
Article.EditTime = DateTime.Now;
nuow.CommitChanges();
//在我的实践中, 上层的UnitOfWork也要提交一次才能真正保存.
(UnitOfWork)nuow.Parent).CommitChanges();
}