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 の複数のインスタンスによって参照できません。
here および他のサイトを調査した後、エラーは明らかに、私のリポジトリパターンと 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();
}
その後、変更はデータベースにコミットされません。何も起こりません。誰かが私を正しい方向に向けることができますか? 私は長い間これと戦ってきました、ありがとう...