2011-07-14 22 views
5

I tienen este código (VS2010 ASP.NET MVC 3 con EF 4):Entity Framework: "La relación entre los dos objetos no se puede definir porque están unidos a diferentes objetos ObjectContext".

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

Se genera el siguiente error (en el "project.ProjectUsers.Add (projectUser)" línea)

" La relación entre los dos objetos no se puede definir porque están unidos a diferentes objetos ObjectContext ".

No entiendo por qué causa, hasta donde yo sé, ambos objetos están usando el mismo ObjectContext (pero soy nuevo en EF).

¿Qué estoy haciendo mal? ¡Gracias por su ayuda!

Respuesta

7

Si la variable user es un tipo de entidad, y se le asigna a un contexto diferente, entonces lo que experimenta este problema.

No creo que el problema es entre sus Project y ProjectUser objetos, sólo porque su objeto ProjectUser no se asigna explícitamente a un contexto - Creo que por defecto se irá al mismo contexto que el Project cuando se va para salvarlo

Creo que este error solo se obtiene cuando realmente tiene dos contextos y trata de unirlos.

+0

¡Tienes razón! Pensé que el problema era entre Project y ProjectUser, pero el problema es de hecho con el usuario. ¡Muchas gracias! – Canam

+0

Me alegro de poder ayudar. –

4

Solo una lista que hizo para Project, necesita agregar ProjectUser al contexto. Así imitar la línea:

context.AddObject(project); 

Y en vez que sea

context.AddObject(projectUser); 

Y hacerlo antes de añadirlo a la colección en proyecto.

+1

Lo intenté, pero dice "Un objeto con un valor temporal de EntityKey no se puede adjuntar a un contexto de objeto". cuando agrego la línea "context.AddObject (projectUser)" antes de la línea "project.ProjectUsers.Add (projectUser)". – Canam

0

No debería ser necesario en absoluto esta línea:

project.ProjectUsers.Add(projectUser); 

Simplemente añadiendo el proyecto debería ser suficiente, ya que se está configurando la relación.

context.AddObject(project); 
+1

Creo que realmente necesito esa línea ... de lo contrario, no hay relación entre el Proyecto y el Usuario del Proyecto. No veo cómo podría haber una relación sin esa línea. – Canam

+0

Tienes razón, leí mal el código. – Jeff

0

Creo que una buena manera de evitar este problema es poner en práctica su applicationdatabase contexto como un singleton.Este es un ejemplo para usted:

aquí su 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; 
    } 
} 

`

aquí su controlador `java

private ApplicationDbContext _db; 

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

`

para que pueda tener la misma instancia exacta no ma tter donde usted está en su aplicación

0

Sé que esto es viejo como la suciedad, pero he pasado varias horas frustrado por este error inútil hoy, y la respuesta de Babacar finalmente me apuntó en la dirección correcta.

Con Ninject gestión de dependencias, que necesitaba para especificar

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

antes de mi EF llama entre la UserManager y varios controladores empezó a comportarse adecuadamente.

Cuestiones relacionadas