我正在处理应用程序,其中User
和Orders
表之间存在父子关系。以下是表格结构:
用户:
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 |
根据我必须一次性更新用户及其订单的功能,可以动态添加,删除或更新订单。
我正在使用Entity Framework 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
怎么办?如果我遵循相同的做法,那么代码将变得复杂且难以处理。因此,寻找这种方案的最佳方法。
答案 0 :(得分:1)
没有必要为应该删除的实体访问数据库。
如果userDetails.Orders
包含应删除的订单,则会将foreach (var item in userToEdit.Orders)
周期内的状态更改为System.Data.Entity.EntityState.Deleted
。
如果没有,您只需创建具有合适身份证件的人,将其附加,然后将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);