日期:2014-05-20  浏览次数:21017 次

ado.net entity 事务 三层 SaveChange 问题
我有一个操作
在一张表中添加一个记录 然后取这个记录的ID 存放到另一张表中的一个字段中 这是一个完整的操作
我在dal层是这样写的

 
C# code
public bool AddOpinion(ref Opinion addOpinion)
        {
            using(ResidentialPropertyMSEntities rpms=new ResidentialPropertyMSEntities())
            {
                try
                {
                    rpms.AddToOpinions(addOpinion);
                    rpms.SaveChanges();
                }
                catch (Exception)
                {
                    return false;
                }

                return true;
            }
        }


还有一个操作就是把另一张表中的字段值改成addOpinion里的OpinionID的值 

我并不是很想共享ObjectContext 总觉得这是不应该出现在BLL层的东西 但是我需要用它的连接才能使用事务 而这个事务却又需要写在BLL层 另外 我并不是很想用存储过程来把这个事务封装 还有什么好的办法能实现事务么? 

顺带问一下SaveChanges()的细节 刚上msdn看了一下文档 说的是 "SaveChanges 在事务内进行操作。 SaveChanges 将回滚该事务" 但是我曾经遇到过一个问题: 用一个sqlserver的事务写一个添加记录(ID是自增长型的) 然后再修改另一张表的数据时,此id是取不到的 类似于 "insert一条记录 select此记录ID update另一张表中的数据"这一组操作 而这里用ado.net entity的SaveChanges()是不存在这个问题的 代码是:

这是一个订单主从表操作
先添加主表 然后再添加从表 添加从表时要取主表的ID 最后SaveChanges() 无分层 
C# code
public bool InsertOrder(OrderPri insertOrderPri,List<OrderDetail> insertOrderDetail)
        {
            try
            {
                smse = new SuperMarketSystemEntities();
                smse.AddToOrderPris(insertOrderPri);
                foreach (var q in insertOrderDetail)
                {
                    q.OrderPriID = insertOrderPri.OrderPriID;
                    smse.AddToOrderDetails(q);
                }
                smse.SaveChanges();
                return true;
            }
            catch
            {
                return false;
            }
        }



谢谢!

------解决方案--------------------
最好还是用触发器来实现比较好
------解决方案--------------------
探讨
引用:

最好还是用触发器来实现比较好

呃 那后一个例子怎么实现好?