要么就一次全成功,要么就一次全失敗,插入主表的同時插入關聯的子表,主表插入時返回當前插入的主鍵,字表插入時用這個主鍵做關聯。
參考代碼如下:
/// <summary> /// 添加角色(同時添加用戶,一個數據庫事務里進行處理) /// </summary> /// <param name="userInfo">用戶</param> /// <param name="entity">實體</param> /// <param name="userIds">用戶主鍵數組</param> /// <param name="statusCode">返回狀態碼</param> /// <param name="statusMessage">返回狀態信息</param> /// <returns>主鍵</returns> public string AddWithUser(BaseUserInfo userInfo, BaseRoleEntity entity, string[] userIds, out string statusCode, out string statusMessage) { var parameter = ServiceParameter.CreateWithMessage(userInfo , MethodBase.GetCurrentMethod() , this.serviceName , AppMessage.RoleService_Add); string result = string.Empty; string returnCode = string.Empty; string returnMessage = string.Empty; ServiceUtil.ProcessUserCenterWriteDbWithTransaction(userInfo, parameter, (dbHelper) => { // 這里是判斷已經登錄的用戶是否有調用當前函數的權限,加強服務層被遠程調用的安全性的 var permissionManager = new BasePermissionManager(userInfo); if (permissionManager.CheckPermissionByUser(userInfo.Id, "RoleAdmin.Add", "添加角色")) { string tableName = userInfo.SystemCode + "Role"; var manager = new BaseRoleManager(dbHelper, userInfo, tableName); result = manager.Add(entity, out returnCode); if (!string.IsNullOrEmpty(result) && userIds != null && userIds.Length > 0) { tableName = userInfo.SystemCode + "UserRole"; var userManager = new BaseUserManager(dbHelper, userInfo, tableName); // 小心異常,檢查一下參數的有效性 if (userIds != null) { userManager.AddToRole(userIds, result); } } returnMessage = manager.GetStateMessage(returnCode); } }); statusCode = returnCode; statusMessage = returnMessage; return result; }