解决XPO的UnitOfWork提交空白记录问题

在制作产品的时候, 如果用户打开了一个产品界面,没有作任何操作,然后打开另外一个产品界面,制作完毕再保存,在进入产品审核的时候,会发出多了一条空白记录.

这种情况产生的原因是,前一次打开时新建了一个空白的产品.在提交的时候用到了SessionFactory.GetUnitOfWork.CommitChanges();

提交了所有更改,包括此次制作的产品和上一次没保存的产品. 而上次的空白产品我们是不希望保存的. 但是这个UnitOfWork又是全局共享的,怎么处理呢?

办法其实不止一个. 我举两例:

方法一: 

你可以在产品制作界面,使用SessionFactory.CreateUnitOfWork()来新建一个UnitOfWork. 以后在所有的操作都在这个新建的UnitOfWork基础上进行.

但这种方法开销很大,不仅会增加数据库连接,还会使得在公共UnitOfWork中已有的对象,需要在新的会话中重新从数据库获取,

方法二:

这是我推荐的方法: 使用NestedUnitOfWork (嵌套的UnitOfWork)

NestedUnitOfWork的特性是组成了一个相对封闭的会话,它提交修改时,只对它上面创建的对象有效.

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

猜你喜欢

转载自blog.csdn.net/bwangel/article/details/6931706