Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.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# 实体框架6和Web API中的多对多更新控制器_C#_Entity Framework_Asp.net Web Api - Fatal编程技术网

C# 实体框架6和Web API中的多对多更新控制器

C# 实体框架6和Web API中的多对多更新控制器,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我无法在Web API中获得更新控制器,以便在同一调用期间同时更新被调用的对象和被引用的对象 我有两门课: public class Foo { public int Id { get; set; } [Required] [MaxLength(250)] public string Title { get; set; } ... public virtual ICollection<Bar> Bars { get; set; } }

我无法在Web API中获得更新控制器,以便在同一调用期间同时更新被调用的对象和被引用的对象

我有两门课:

public class Foo
{
    public int Id { get; set; }
    [Required]
    [MaxLength(250)]
    public string Title { get; set; }
    ...
    public virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
     public int Id { get; set }
     public string Name { get; set; }
     ...
     public virtual ICollection<Foo> Foos { get; set; }
}
将允许更新控制器更新条的Foo集合,但不更新条的其余部分

不幸的是,尝试使用这两个调用总是会抛出一个“Attaching Entity of type”错误,因为每个bar项都将一个foo项加载到上下文中,反之亦然

尝试类似于:

db.Entry(_bar).CurrentValues.SetValues(bar);
db.Entry(_bar).Collection(b => b.Foos).Load();
db.Entry(_bar).Collection(b => b.Foos).CurrentValue = bar.Foos;
导致每次更新时foo和bar的拷贝数呈指数级增长


这有什么办法吗?实体框架将生成正确的数据库结构,但却使其无法工作,这让我感到奇怪。

尝试一下,如果您有问题,请告诉我

Bar _bar = db.Bars.Find(id);
var removed =_bar.Foos.Except(bar.Foos);
var added = bar.Foos.Except(_bar.Foos);

var toRemoveTracked =_bar.Foos.Where(foo => removed.Any(r => r.FooId == foo.FooId))
                              .ToList();

added.ToList().ForEach(_bar.Foos.Add);
toRemoveTracked.ForEach((fooo) => {_bar.Foos.Remove(fooo);});

await db.SaveChangesAsync();

同时从
ICollection
属性中删除延迟加载(通过删除
ICollection
之前的虚拟关键字完成)

您到底想做什么,您是想更新bar的属性,还是想从bar集合中删除Foos?更新后,bar上的Foos集合将发生更改。它们可能是要链接的一些新关联,以及要删除的一些旧链接。
db.Entry(_bar).CurrentValues.SetValues(bar);
db.Entry(_bar).Collection(b => b.Foos).Load();
db.Entry(_bar).Collection(b => b.Foos).CurrentValue = bar.Foos;
Bar _bar = db.Bars.Find(id);
var removed =_bar.Foos.Except(bar.Foos);
var added = bar.Foos.Except(_bar.Foos);

var toRemoveTracked =_bar.Foos.Where(foo => removed.Any(r => r.FooId == foo.FooId))
                              .ToList();

added.ToList().ForEach(_bar.Foos.Add);
toRemoveTracked.ForEach((fooo) => {_bar.Foos.Remove(fooo);});

await db.SaveChangesAsync();