.net EF 事物 订单流水号的生成 (二):观察者模式、事物、EF
针对.net EF 事物 订单流水号的生成 (一) 的封装。
数据依然不变。
using System; using System.Linq; using System.Transactions; namespace ConsoleApplication1 { class Program { static pengbgDBEntities db = new pengbgDBEntities(); static void Main(string[] args) { try { DAL dal = new DAL(); dal.AddOrder += dal_AddOrder; var newOrderNo = dal.Tran(DAL.EnumOrderType.SM); Console.WriteLine("添加成功:" + newOrderNo); } catch (Exception exception) { Console.WriteLine(exception.Message); } finally { Console.WriteLine("按任意键继续"); Console.ReadKey(); } } static int dal_AddOrder(string orderNo) { db.SalesOrder.Add(new SalesOrder() { UserName = Console.ReadLine(), OrderNo = orderNo, OrderDate = DateTime.Now }); return db.SaveChanges(); } } public class DAL { public delegate int DelTranOrder(string orderNo); public event DelTranOrder AddOrder; public pengbgDBEntities db = new pengbgDBEntities(); public int Add(string orderNo) { return AddOrder(orderNo); } public string BulidOrderNo(EnumOrderType enunType) { var orderType = enunType.ToString(); var flowNo = db.FlowNo.FirstOrDefault(x => x.OrderType == orderType); var flowNoStart = DateTime.Now.ToString("yyMMdd-"); var flowNoEnd = "1"; if (flowNo != null) { if (flowNo.OrderNo.Split('-')[0] != orderType + flowNoStart) { flowNoEnd = (int.Parse(flowNo.OrderNo.Split('-')[1]) + 1).ToString(); } } else { db.FlowNo.Add(new FlowNo { OrderNo = flowNoStart + flowNoEnd.PadLeft(5, '0'), OrderType = orderType, Remark = "New" }); } return orderType + flowNoStart + flowNoEnd.PadLeft(5, '0'); } public string Tran(EnumOrderType orderType) { var newOrderType = BulidOrderNo(orderType); using (var scope = new TransactionScope()) { AddOrder(newOrderType); var flowNo = db.FlowNo.FirstOrDefault(x => x.OrderType == orderType.ToString()); if (flowNo != null) flowNo.OrderNo = newOrderType; db.SaveChanges(); scope.Complete(); } return newOrderType; } public enum EnumOrderType { SM,//销售订单 PM // 外发订单 //......其他 } } }