2010-11-13 28 views
8

Mi problema resultó tener dos contextos. Rehice mi código un poco para tener solo un contexto y mi problema desapareció.Código Entity Framework Primero Muchos a muchos crear filas duplicadas

Tengo un usuario que tiene una lista de UserContact que tiene una Opción de contacto. Es bastante simple 1 a muchos, muchos a 1 con la tabla UserContact en el medio.

Si saco al usuario del archivo db y creo un nuevo UserContact, pero configuro ContactOption para un elemento existente (que saqué del db), cuando SaveChanges, entity framework crea una nueva ContactOption en la base de datos que es esencialmente un duplicado de la que agregué al UserContact (con la excepción de que obtiene una nueva identificación).

He luchado con esto durante varias horas y no puedo resolver esto. ¿Algunas ideas?

Estoy usando un patrón de Repositorio para mis consultas a la base de datos, pero me he asegurado de que estén compartiendo el mismo contexto.

me tire el usuario de la base de datos con esto:

var user = _context.Users.Include("UserContacts.ContactOption") 
       .Where(id => id == 1); 

y el contacto opciones son sacados con:

var co = _context.ContactOptions.FirstOrDefault(c => c.Id == id); 

Y añado el ContactOption a la UserContact así:

var contactOption = _context.ContactOptions.FirstOrDefault(c => c.Id == someId); 

var contact = new UserContact { ContactOption = contactOption }; 
contact.Data = "someData"; 

user.UserContacts.Add(contact); 

Mi modelo se ve así:

public class User 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual ICollection<UserContact> UserContacts { get; set; } 
} 

public class UserContact 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public User User { get; set; } 

    [Required] 
    public ContactOption ContactOption { get; set; } 
    public string Data { get; set; } 
} 

public class ContactOption 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
+1

puede mostrar el código donde asocia la Opción de Contacto al UserContact –

+0

Justin, he actualizado la pregunta como se le solicitó. ¡Gracias! –

Respuesta

2

corro su código y dieron los resultados esperados exactas: Una nueva fila en UserContacts tabla con la identificación de usuario existente y ContactOptionId, así que no estoy seguro de lo que happing allí, pero se puede tratar de tener explícitamente FKs en El objeto UserContact para que tenga control total sobre cómo Code First inserta registros para usted. Para eso, es necesario cambiar UserContact de la siguiente manera:

public class UserContact 
{ 
    public int Id { get; set; } 

    // By Convention these 2 properties will be picked up as the FKs: 
    public int UserId { get; set; } 
    public int ContactOptionId { get; set; } 

    [Required] 
    public User User { get; set; }   
    [Required] 
    public ContactOption ContactOption { get; set; } 

    public string Data { get; set; } 
} 

Y a continuación, puede cambiar el código de la siguiente manera:

var contactOption = _context.ContactOptions.Find(someId); 
var user = _context.Users.Find(1); 

var contact = new UserContact 
{ 
    ContactOptionId = contactOption.Id, 
    UserId = user.Id, 
    Data = "someData" 
}; 

user.UserContacts.Add(contact); 
context.SaveChanges(); 
+0

No sé si marcar su respuesta como correcta o no. Sí me ayudó a llevarme a donde tenía que ir, pero no lo resolví de la manera en que lo hiciste. Mi problema resultó ser que tenía dos contextos porque en mi ModelBinder estaba creando un nuevo repositorio. Lo arreglé con algo de DI bondad y mi problema es bueno ahora! –

+0

Gracias por su actualización y sí, sabía que el problema está en otra parte ya que, como dije, literalmente copié y pegué el código, y funcionó como esperaba. Mi intención al publicar esta respuesta fue mostrarles cómo podemos desplegar los FK explícitos, de modo que ya no estamos obligados a ningún convenio de código desconocido y podemos asegurarnos de que el código funcione de la manera que queremos que funcione. –

+0

Voy a marcar su respuesta como correcta, ya que me ayudó. También editaré mi pregunta para señalar que la creación de dos contextos fue mi problema. –

1

Mi problema resultó estar teniendo dos de contexto. Rehice mi código un poco para tener solo un contexto y mi problema desapareció. Gracias a Morteza Manavi por señalarme en la dirección correcta.

+0

No hay problema y gracias por la actualización. –

Cuestiones relacionadas