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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top