Utilizo Entity Framework 4.3 Code First y tengo problemas para actualizar las relaciones de muchos a muchos.No se pueden actualizar las relaciones de muchos a muchos en Entity Framework
que definen las siguientes clases:
public abstract class Entity
{
[Column(Order = 0)]
[Key]
public int Id { get; set; }
[Timestamp]
[Column(Order = 1)]
public byte[] Version { get; set; }
}
public class Video : Entity
{
public string Title { get; set; }
public string Description { get; set; }
public TimeSpan Length { get; set; }
public virtual ICollection<Coworker> Coworkers { get; set; }
}
public class Coworker : Entity
{
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Video> Videos { get; set; }
}
Cuando se crea la base de datos, el aspecto esquema de la derecha: Hay una Vídeos, compañeros de trabajo y VideoCoworkers mesa también, sin
utilizo patrón de repositorio de una aplicación de n niveles acceder a la base de datos, mi método de inserción y actualización es el siguiente:
public T Insert(T entity)
{
//Creates database context. When it disposes, it calls context.SaveChanges()
using (var session = new DatabaseSession())
{
session.Context.Set<T>().Add(entity);
}
}
public T Update(T entity)
{
//Creates database context. When it disposes, it calls context.SaveChanges()
using (var session = new DatabaseSession())
{
entity = session.Context.Set<T>().Attach(entity);
session.Context.Entry(entity).State = EntityState.Modified;
}
return entity;
}
Cuando actualizo una entidad, que CR Eate el objeto de entidad desde un DTO, es por eso que usa DbSet.Attach en lugar de seleccionarlo y actualizar las propiedades una a una.
Cuando inicializar la base de datos, agrego algunos datos de prueba:
- crear 3 Compañeros de trabajo, donde hice nombre y apellido. (A, B, C)
- Crear 3 videos, donde establezco el título, la descripción y la longitud, y también establezco algunos compañeros de trabajo. El primer video tiene A, B, el segundo tiene B, C y el tercero tiene A, C.
Cuando enumero los videos de código, se puede ver que la colección Video.Coworkers está lleno de buenos valores, y cuando consulta la tabla de enlace (VideoCoworkers) en SQL Server Management Studio, también se ve bien.
Mi problema es cuando actualizo, por ejemplo, el título del video, funciona. Pero cuando intento eliminar de Video2 a los compañeros de trabajo existentes (B y C) y trato de agregar al compañero de trabajo A, la relación no se actualiza. Tampoco funciona cuando intento agregar un nuevo compañero de trabajo o solo intento eliminar uno. Creo la entidad que se usa como el parámetro del método Update() creando una nueva entidad Video con una nueva colección de Compañeros de Trabajo (que se seleccionan de la base de datos con el método Find() por Id).
¿Cuál es la forma correcta de actualizar las relaciones entre varios?
No dice cómo elimina a los compañeros de trabajo de los videos, pero creo que debería recorrer la colección de videos de un compañero de trabajo y marcar los elementos que coincidan con sus DTO tal como se eliminaron. –