简体   繁体   中英

Entity Framework: “The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.”

I have this code (VS2010 ASP.NET MVC 3 with EF 4):

Project project = new Project();
project.Number = number;
project.Name = name;
context.AddObject(project);

ProjectUser projectUser = new ProjectUser();
projectUser.User = user;
projectUser.Status = 1;
project.ProjectUsers.Add(projectUser);

context.SaveChanges(true);

It generates the following error (on the "project.ProjectUsers.Add(projectUser)" line)

"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."

I don't understand why cause, as far as I know, both objects are using the same ObjectContext (but I'm new to EF).

What am I doing wrong? Thanks for your help!

If your user variable is an entity type, and it is assigned to a different context, then you'd experience this problem.

I don't think the problem is between your Project and ProjectUser objects, only because your ProjectUser object isn't explicitly assigned to a context - I think by default it will go to the same context as the Project when you go to save it.

I believe you get this error only when you truly have two contexts and try to join them together.

Just list you did for Project, you need to add the ProjectUser to the context. So mimic the line:

context.AddObject(project);

And instead make it

context.AddObject(projectUser);

And do that before you add it to the collection on project.

I think a good way to avoid this problem is to implement your application database context as a singleton . Here is a sample for you:

here your ApplicationDbContext.cs `java

public class ApplicationDbContext : DbContext, IDbContextFactory<DbContext>
{
    protected static ApplicationDbContext _instance { private set; get; }

    private ApplicationDbContext() : base("ApplicationDbContext")
    {
    }

    public DbContext Create()
    {
        return getInstance();
    }


    public static ApplicationDbContext getInstance()
    {
        if (_instance == null) {
            _instance = new ApplicationDbContext();
        }
        return _instance;
    }
}

`

here your controller `java

private ApplicationDbContext _db;

public class HelloController : Controller
{
    _db = ApplicationDbContext.getInstance();
}

`

so you can have the exact same instance no matter where you are in you app

I know this is old as dirt, but I spent several hours being frustrated by this unhelpful error today, and Babacar's answer finally pointed me in the right direction.

With Ninject managing dependencies, I needed to specify

kernel.Bind<Context>().ToSelf().InSingletonScope();

before my EF calls between the UserManager and various controllers started behaving properly.

You shouldn't need this line at all:

project.ProjectUsers.Add(projectUser);

Just adding the project should be sufficient, because you're setting the relationship.

context.AddObject(project);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM