Entity Framework 4.1-Código Primero: Relación de muchos a muchos
-
22-10-2019 - |
Pregunta
Quiero construir una relación como esta (una zona está en el vecindario de X otras zonas)
public class Zone
{
public string Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ZoneNeighourhood> ZoneNeighourhoods { get; set; }
}
public class ZoneNeighbourhood
{
public virtual Zone Zone1 { get; set; }
public virtual Zone Zone2 { get; set; }
}
Desafortunadamente, esto no funcionará, porque los FK generados por EF no son correctos ... ¿Cómo puedo hacer que funcione una estructura como esta?
Ejemplo con 3 zonas: Zona 1, Zona 2, Zona 3
Vecinos de la Zona 1:
Zona 2, Zona 3
Zona 2 Vecinos:
Zona 1
Zona 3 Vecinos:
Zona 1
¿Algún consejo?
Solución
Su mapeo no es correcto. Está creando una entidad de auto referencia, por lo que necesita una colección separada para relaciones entrantes y salientes. La colección única no es suficiente.
public class Zone
{
public string Id { get; set; }
public string Name { get; set; }
[InverseProperty("NeighbourOf")]
public virtual ICollection<Zone> NeighbourTo { get; set; }
[InverseProperty("NeighbourTo")]
public virtual ICollection<Zone> NeighbourOf { get; set; }
}
No necesita asignar la tabla de unión a menos que también desee agregar algunas propiedades adicionales a la relación.
Si solo desea una sola colección, debe usar mapeo fluido:
public class Zone
{
public string Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Zone> Neighours { get; set; }
}
public class Context : DbContext
{
public DbSet<Zone> Zones { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Zone>()
.HasMany(z => z.Neighbours)
.WithMany();
}
}
Otros consejos
Dave,
¿Qué tal solo?
public class Zone {
public string Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Zone> Neighours { get; set; }
}
¿O me estoy perdiendo algo? ¿Necesita modelar el vecindario como una entidad externa por alguna otra razón? Me pregunto qué esquema de base de datos generaría el trabajo de la entidad para eso ... No soy un experto, de hecho, soy un novato en esta área. No creo que tenga un problema con las tablas de autorrefirección como esta ... el mejor nada que haya leído hasta ahora lo indica. Vamos a intentarlo y averiguarlo ;-)
Salud. Keith.