C# Clean方法以更新实体框架中的集合
如果已经有人问过这个问题,我很抱歉,但我在实体框架中更新集合的方法遇到了麻烦 让我解释一下情况: -例如,我有一个具有一些属性和订单集合的模型客户(例如)。 -让我们想象一下,我们有一个管理页面,可以编辑客户的所有订单,当我们提交表单时,它会将更新的订单(一些已添加,一些已更新,一些已删除)发送回对象客户 目前,我使用这样的方法来比较旧集合和新集合,并确定需要删除/更新/添加哪个对象C# Clean方法以更新实体框架中的集合,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,如果已经有人问过这个问题,我很抱歉,但我在实体框架中更新集合的方法遇到了麻烦 让我解释一下情况: -例如,我有一个具有一些属性和订单集合的模型客户(例如)。 -让我们想象一下,我们有一个管理页面,可以编辑客户的所有订单,当我们提交表单时,它会将更新的订单(一些已添加,一些已更新,一些已删除)发送回对象客户 目前,我使用这样的方法来比较旧集合和新集合,并确定需要删除/更新/添加哪个对象 var toRemove = new List<ORDERS>(); var to
var toRemove = new List<ORDERS>();
var toAdd = new List<ORDERS>();
foreach (
var order in
oldList.Where(
order =>
newList.FirstOrDefault(t => t.link_id == order.link_id) == null))
{
toRemove.Add(order);
}
foreach (
var order in
newList.Where(
order =>
oldList.FirstOrDefault(t => t.link_id == order.link_id) == null))
{
toAdd.Add(order);
}
foreach (var ORDERSe in toRemove)
{
bdd.ORDERS.Remove(ORDERSe);
}
foreach (var ORDERSe in toAdd)
{
ORDERSe.pjt_id = project_id;
bdd.ORDERS.Add(ORDERSe);
}
foreach (
var order in
newList.Where(
order =>
oldList.FirstOrDefault(t => t.link_id == order.link_id) != null))
{
var child = oldList.FirstOrDefault(t => t.link_id == order.link_id);
bdd.Entry(child).CurrentValues.SetValues(order);
}
我是否遗漏了关于实体框架的任何内容?
因为当我这样做的时候,它只是重复我的命令。
提前谢谢你的回答
但我不同意这一点,因为在我看来,实体框架
应该能为我做这项工作
事实上,EF为您做这项工作。使用data context SaveChanges方法EF应该能够一次保存所有更改:
DbContext.SaveChanges()
为了方便起见,您仍然可以重写此方法。在内部,您应该使用如下内容:
public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<IAuditable>();
if (changeSet != null)
{
foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
entry.Entity.ModifiedDate = DateProvider.GetCurrentDate();
entry.Entity.ModifiedBy = UserName;
}
}
return base.SaveChanges();
public override int SaveChanges()
{
var changeSet=ChangeTracker.Entries();
if(变更集!=null)
{
foreach(changeSet.Where(c=>c.State!=EntityState.Unchanged)中的var条目)
{
entry.Entity.ModifiedDate=DateProvider.GetCurrentDate();
entry.Entity.ModifiedBy=用户名;
}
}
返回base.SaveChanges();
}使用.Except()和.Intersect()当然可以使它更干净,但概念并没有真正改变,因为您仍然需要单独删除、更新和添加循环中的条目
var oldList = new List<ORDERS>();
var newList= new List<ORDERS>();
var IdsToRemove = oldList.Select(t => t.link_id).Except(newList.Select(t => t.link_id));
var IdsToAdd = newList.Select(t => t.link_id).Except(oldList.Select(t => t.link_id));
var IdsToUpdate = newList.Select(t => t.link_id).Intersect(oldList.Select(t => t.link_id));
//remove
bdd.orders.where(x => IdsToRemove.Contains(x.link_id)).ForEach(x => bdd.Remove(x));
//add
foreach(var order in newList.Where(x -> IdsToAdd.Contains(x.link_id))
{
bdd.Orders.Attach(order);
bdd.Entries(order).EntityState = EntityState.Added;
}
//update
foreach(var order in newList.Where(x -> IdsToUpdate .Contains(x.link_id))
{
bdd.Orders.Attach(order);
bdd.Entries(order).EntityState = EntityState.Modified;
}
bdd.SaveChanges();
var oldList=新列表();
var newList=新列表();
var IdsToRemove=oldList.Select(t=>t.link\u id)。除了(newList.Select(t=>t.link\u id));
var IdsToAdd=newList.Select(t=>t.link\u id)。除了(oldList.Select(t=>t.link\u id));
var IdsToUpdate=newList.Select(t=>t.link\u id).Intersect(oldList.Select(t=>t.link\u id));
//除去
其中(x=>IdsToRemove.Contains(x.link_id)).ForEach(x=>bdd.Remove(x));
//加
foreach(newList.Where(x->IdsToAdd.Contains(x.link\u id))中的变量顺序)
{
bdd.订单。附(订单);
bdd.Entries(order).EntityState=EntityState.Added;
}
//更新
foreach(newList.Where(x->IdsToUpdate.Contains(x.link\u id))中的变量顺序)
{
bdd.订单。附(订单);
bdd.Entries(order).EntityState=EntityState.Modified;
}
bdd.SaveChanges();
我真的认为你应该从头开始。你需要整合所有这些forEach循环。你为什么不使用方法?这是一种使用你自己的订单
POCO类的努力吗?你正在尝试将你的类映射到你的EF类?为什么不只使用EF类?尽管没有润滑,但可能是你正在寻找的int并不是真正的代码质量(只是作为示例编写的!),而是我们更新集合的方式(3个循环),谢谢您的回答
var oldList = new List<ORDERS>();
var newList= new List<ORDERS>();
var IdsToRemove = oldList.Select(t => t.link_id).Except(newList.Select(t => t.link_id));
var IdsToAdd = newList.Select(t => t.link_id).Except(oldList.Select(t => t.link_id));
var IdsToUpdate = newList.Select(t => t.link_id).Intersect(oldList.Select(t => t.link_id));
//remove
bdd.orders.where(x => IdsToRemove.Contains(x.link_id)).ForEach(x => bdd.Remove(x));
//add
foreach(var order in newList.Where(x -> IdsToAdd.Contains(x.link_id))
{
bdd.Orders.Attach(order);
bdd.Entries(order).EntityState = EntityState.Added;
}
//update
foreach(var order in newList.Where(x -> IdsToUpdate .Contains(x.link_id))
{
bdd.Orders.Attach(order);
bdd.Entries(order).EntityState = EntityState.Modified;
}
bdd.SaveChanges();