实体框架-在单个事务中更新父-子表

本文关键字:更新 子表 单个 框架 实体 事务 | 更新日期: 2023-09-27 18:16:10

我正在研究应用程序,其中我在UserOrders表之间有父子关系。下面是表格结构:

用户:

Column  | DataType  | Constraint
--------|-----------|-------------
UserId  | int       | Primary key
Username| varchar   |
Email   | varchar   |
IsActive| bit       |

:

Column  | DataType  | Constraint
--------|-----------|----------
OrderId | int       | Primary key
UserId  | int       | Foreign key to User.UserId
Type    | smallint  |
Quantity| smallint  |

根据功能,我必须一次更新用户和他的订单,订单可以动态添加,删除或更新。

我正在使用实体框架6.0,我找不到任何最好的解决方案来更新父表(user)和子表(order)在单个事务。

谁能解释一下实现这种功能的最佳方法?

下面是我使用的代码:

请注意,我正在使用AutoMapper将对象映射到实体

public bool ManageUser(UserModel userDetails, string deletedOrders)
{
    var isSuccess = false;
    try
    {
        using (var entity = new UserEntity())
        {
            if (userDetails.UserId == 0)
            {
                entity.Users.Add(Mapper.Map<User>(userDetails));
            }
            else
            {
                var userToEdit = Mapper.Map<User>(userDetails);
                foreach (var item in userToEdit.Orders)
                {
                    if (item.OrderId == 0)
                    {
                        entity.Entry(item).State = System.Data.Entity.EntityState.Added;
                    }
                    else
                    {
                        entity.Entry(item).State = System.Data.Entity.EntityState.Modified;
                    }
                }
                /*** 
                * How to Write a code here to remove orders using deletedOrders parameter
                * Note: deletedOrders contains comma separated Id of the orders which needs to be removed. e.g. "1,5,6" 
                ****/
                entity.Entry(userToEdit).State = System.Data.Entity.EntityState.Modified;
            }
            entity.SaveChanges();
            isSuccess = true;
        }
    }
    catch (Exception ex)
    {
    }
    return isSuccess;
}

注意:这只是一个简单的代码。但如果我将有多个子表,如Order呢?如果我遵循同样的做法,那么代码将变得复杂且难以处理。所以要寻找这种情况下的最佳方法。

实体框架-在单个事务中更新父-子表

对于需要删除的实体,无需再访问数据库。

  1. 如果userDetails.Orders包含应该删除的订单,您可以将其状态更改为foreach (var item in userToEdit.Orders)循环中的System.Data.Entity.EntityState.Deleted

  2. 如果没有,您只需创建具有合适id的,附加它们,然后将它们的EntityState更改为Deleted:

    var ordersToDelete = deletedOrders.Split(new[] {','},
      StringSplitOptions.RemoveEmptyEntries).Select(x => new Order 
        { 
            Id = int.Parse(x.Trim())
        })
        .ToList();
    ordersToDelete.ForEach(o => 
        entity.Entry(x).State = System.Data.Entity.EntityState.Deleted);