Я пытаюсь выяснить, что вызывает эту ошибку, я перечислил некоторые из соответствующих областей моего кода, которые, надеюсь, помогут решить мою проблему.
Коллекция элементов объекта рецепта показана ниже:
public virtual IList<Member> Members { get; set; }
а вот коллекция Recipes в сущности-члене:
public virtual IList<Recipe> Recipes { get; set; }
Я делаю следующее при создании своего DbContext, чтобы создать отношение «многие ко многим» в отдельной таблице.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// have to specify these mappings using the EF Fluent API otherwise I end up with
// the foreign key fields being placed inside the Recipe and Member tables, which wouldn't
// give a many-to-many relationship
modelBuilder.Entity<Recipe>()
.HasMany(r => r.Members)
.WithMany(m => m.Recipes)
.Map(x => {
x.ToTable("Cookbooks"); // using a mapping table for a many-to-many relationship
x.MapLeftKey("RecipeId");
x.MapRightKey("MemberId");
});
modelBuilder.Entity<Recipe>()
.HasRequired(x => x.Author)
.WithMany()
.WillCascadeOnDelete(false);
}
Я также заполняю свою базу данных при изменении модели, и все, что мне нужно было сделать, это добавить в коллекцию элементов рецепта, и, похоже, он смог разобрать все остальное для меня и поместить соответствующие ключи в таблицу отношений моей кулинарной книги.
Это часть кода в моем действии контроллера рецептов, который выполняет эту работу:
var memberEntity = memberRepository.Find((int)memberId);
var recipeEntity = recipeRepository.Find(recipeId);
recipeEntity.Members.Add(memberEntity);
recipeRepository.InsertOrUpdate(recipeEntity);
recipeRepository.Save();
Вот метод вставки или обновления в моем репозитории рецептов
public void InsertOrUpdate(Recipe recipe)
{
if (recipe.Id == default(int))
{
// New entity
context.Recipes.Add(recipe);
} else
{
// Existing entity
context.Entry(recipe).State = EntityState.Modified;
}
}
Я получаю сообщение об ошибке «InvalidOperationException: связь между двумя объектами не может быть определена, потому что они прикреплены к разным объектам ObjectContext». в этой строке:
context.Entry(recipe).State = EntityState.Modified;
Кто-нибудь знает, почему это произошло? Должен ли я добавлять член в рецепт и наоборот, чтобы это работало? Я не уверен, в чем проблема, потому что recipeEntity кажется правильным.
Любая помощь будет оценена, спасибо.
ИЗМЕНИТЬ Контекст создается в каждом репозитории (RecipeRepository и MemberRepository), как показано, поэтому я предполагаю, что проблема заключается в том, что для каждого запроса .Find () используется другой контекст? и что вызывает проблемы?
private EatRateShareDbContext context = new EatRateShareDbContext();