EFCodeFirst:两个对象之间的关系不能被限定,因为它们连接到不同的ObjectContext

2019-09-22 04:30发布

我试图找出是什么原因造成这个错误,我列出了一些我的代码的相关领域应该有希望帮助回答我的问题。

配方实体的成员集合如下图所示:

public virtual IList<Member> Members { get; set; }

这里是在成员单位的食谱收集:

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();

Answer 1:

我不知道这是解决方案,但它似乎像你在你的仓库使用不同的上下文。
首先确保你对每个生命周期相同的上下文。 寿命可以根据您的项目类型有所不同。 (例如,用于web项目, 通常是同每个HttpContext的 )。 您可以使用国际奥委会管理上下文生存期。 对于.NET好的IOC库autofac和温莎城堡

另外,我觉得你要调用InsertOrUpdate方法是不必要的(除非你调用Find方法有没有跟踪。)只是删除线,看看它的工作原理:

var recipeEntity = recipeRepository.Find(recipeId);
recipeEntity.Members.Add(memberEntity);
recipeRepository.Save();

每股您的DbContext一个简单的方法HttpRequest提到这里 。



Answer 2:

如果你正在使用AutoFac,你必须添加SingleInstance()到您的注册代码。

例如:。builder.Register(A =>新EntityContainer相关())作为()SingleInstance()。

其中EntityContainer相关是你的DbContext



文章来源: EFCodeFirst : The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects