2011-04-16 19 views
7

Estoy intentando eliminar un objeto de una colección en el marco de la entidad, pero desafortunadamente mi código está fallando. Estaría agradecido si pudieras echar un vistazo y avisarme si puedes descubrir lo que estoy haciendo mal. Mis objetos son los siguientes:Eliminar() no funciona con la relación de muchos a muchos en Entity Framework

  • persona < -> Placa (relación de muchos a muchos)
  • Placa < -> BadgeRequirement (relación de uno a muchos)
  • persona contiene un ICollection de insignias
  • insignia contiene un ICollection de la persona
  • BadgeRequirement contiene una clave externa Placa

Agregar y editar entradas funciona absolutamente bien.

Sin embargo, cuando intento para eliminar una insignia de una persona con el siguiente código, que no funciona:

Postback event handler on example.aspx 
****The person object has been loaded as part of the load event on the page**** 

Badge badge = BadgeHelper.getBadge(badgeID); 
if (command == "Delete") 
{ 
PersonHelper.removeBadgeFromPerson(badge, person); 
} 

Delete method on PersonHelper class (wrapper for all processing) 

person.Badges.Remove(badge); 
DbContext.SaveChanges(); 

El Remove (divisa) devuelve falso y no puedo Profile como yo estoy usando SQL Compact 4.0

¡Gracias de antemano por su ayuda!

+0

¿Se puede depurar el código y comprobar que 'colección Badges' en el' Person' contiene la credencial que están tratando de eliminar? ¿Contiene alguna insignia? –

+0

Hola Ladislav, puedo verificar que el objeto persona contiene una colección Badges completamente cargada. En mi consulta "Obtener", utilizo el p desde la persona. Incluir ("Insignias") para asegurarme de que la colección se carga y se transmite en consecuencia. Sin embargo, cuando intento eliminar la insignia en cuestión de la colección, no se realiza ninguna eliminación. En cambio, remove (badge) devuelve falso. No estoy seguro si esto ayuda. Gracias – Chris

Respuesta

14

Esto se resolvió realmente en uno de los foros de MSDN. Los detalles completos se pueden encontrar en el enlace here

Sin embargo, como resumen, para usar el método Remove(), ambas colecciones en la relación de muchos a muchos deben cargarse antes de que se produzcan cambios. El ejemplo de código se adjunta a continuación:

class Program { 
static void Main(string[] args) 
{ 
    using (var context= new MyContext()) 
    { 
    var post1 = context.Posts.Find(3); 
    var tag1 = context.Tags.Find(2); 
    context.Entry(post1).Collection("Tags").Load(); 
    post1.Tags.Remove(tag1);   
    context.SaveChanges(); 
    } 
} 
} 
public class Post 
{ 
    public int PostId { get; set; } 
    public string PostContext { get; set; } 
    public ICollection<Tag> Tags { get; set; } 
} 
public class Tag 
{ 
    public int TagId { get; set; } 
    public string TagContext { get; set; } 
    public ICollection<Post> Posts { get; set; } 
} 
public class MyContext:DbContext 
{ 
    public DbSet<Post> Posts { get; set; } 
    public DbSet<Tag> Tags { get; set; } 
} 

Espero que esto ayude a alguien más con problemas similares.

3

tenían el mismo problema, Acabé la ejecución de un comando SQL prima con arreglo a la tabla de unión:

DbContext.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Badges_Persons] WHERE Badge_Id=5000 AND Person_Id=1000"); 
DbContext.SaveChanges(); 
+4

No debería tener que ejecutar un comando SQL sin formato. – PussInBoots

Cuestiones relacionadas