4
我知道在此处多次提到过这个问题,但我无法找到如何在EF CF中添加或更新导航属性的确定答案。在EF中添加/更新导航属性CF
实体(简体):
public class Basket : EntityBase
{
public virtual List<Fruit> TaggedFruits { get; set; }
}
public class Fruit : EntityBase
{
}
的ActionResult:
[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();
}
然后没有改变被提交到数据库。根本没有任何反应。有人能指引我朝着正确的方向吗?我一直在争取这种方式,长,谢谢...
我可以吻你。谢谢。只有我更改的行是: context.Entry(basketInDB).CurrentValues.SetValues(basket); 我将它设置为 context.Entry(basketInDB).CurrentValues.SetValues(basketInDB); ,因为我失去了传递给方法的篮子对象中的数据。这有什么问题吗?它似乎坚持了我打算保留的所有旧数据,但仍然更新了这种关系。好酷? – 2012-04-24 16:36:07
@JeffBorden:不,这没有问题,但它使得这条线是多余的(你正在更新一个本身的实体=根本没有更新)。只需完全删除该行,它仅适用于篮子上的其他标量属性,并不会影响更新与TaggedFruits的关系。 – Slauma 2012-04-24 16:42:35
明白了。救生员,谢谢你的队友。 – 2012-04-24 16:48:35