我知道这在 SO 上已被多次询问,但我找不到关于如何在 EF CF 中添加或更新导航属性的明确答案。
实体(简化):
public class Basket : EntityBase
{
public virtual List<Fruit> TaggedFruits { get; set; }
}
public class Fruit : EntityBase
{
}
行动结果:
[HttpPost]
public ActionResult SaveTags(Basket basket, int[] selectedFruits)
{
basket.TaggedFruits = new List<Fruits>();
foreach (int guid in selectedFruits)
basket.TaggedFruits.Add(repository.Fruits.FirstOrDefault(p => p.Id == guid));
using (var context = new EFDbContext())
{
context.Baskets.Attach(basket);
context.SaveChanges();
}
return RedirectToAction("GetBasket", new {guid = basket.Guid});
}
我已经尝试了上述 SaveTags 方法的多次迭代,但从未让它工作。这个抛出:
一个实体对象不能被多个 IEntityChangeTracker 实例引用。
在研究了这里和其他站点之后,错误显然表明在方法中混合我的存储库模式和 DBContext 会导致冲突。
如果我将标记移动到存储库,使用以下方法:
[HttpPost]
public ActionResult SaveTags(Basket basket, int[] selectedFruits)
{
List<Fruit> taggedFruits = new List<Fruit>();
foreach (int guid in selectedFruits)
taggedFruits.Add(new Fruit {Id = guid});
libraryRepository.TagBasket(basket, taggedFruits);
return RedirectToAction("GetBasket", new {guid = basket.Guid});
}
/*in repository*/
public void TagBasket(Basket basket, List<Fruit> fruits )
{
basket.Taggedfruits = new List<Fruit>();
foreach (var fruit in fruits)
{
basket.Taggedfruits.Add(Fruit);
}
context.Baskets.Attach(basket);
context.SaveChanges();
}
然后不会向数据库提交任何更改。什么都没有发生,根本没有。有人可以指出我正确的方向吗?我已经为此奋斗了很久,谢谢...