C# 实体框架6和Web API中的多对多更新控制器
我无法在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; } }
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();