Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Clean方法以更新实体框架中的集合_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

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();