Referenciación automática de la relación recursiva de muchos a muchos code first Entity Framework


Parece que no puedo hacer que esto funcione en absoluto

class Member
{
    public virtual IList<Member> Friends { get; set; }
    [Key]
    public int MemberId { get; set; }
    public string Name{ get; set; }
}

Traté de agregar asignaciones, pero en vano. ¿Hay alguna manera de hacerlo con CTP5?

Author: Korayem, 2011-02-26

4 answers

Por convención, el Código Primero tomará asociaciones unidireccionales como uno a muchos. Por lo tanto, debe usar fluent API para que el código sepa primero que desea tener una asociación de referencia automática de muchos a muchos:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany();
}

Nota: Hay un error conocido en CTP5 que no le permitirá personalizar los nombres de columna de la tabla de unión en este escenario.

 58
Author: Morteza Manavi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-26 18:17:52

Si estoy en lo cierto, puedes influir en el nombre de la tabla de muchos a muchos con este código:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany().Map(m =>
        {
            m.MapLeftKey("MemberId");
            m.MapRightKey("FriendId");
            m.ToTable("MembersFriends");
        }
    );
}

Espero que esto ayude.

 16
Author: Nils,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-23 12:46:39

Puede hacer que esto funcione en EF 4 CTP5 usando Model-First, pero el Código CTP5 First tiene demasiados errores con configuraciones de consulta auto-referenciales y polimórficas para usar el Código Primero para tales escenarios. Morteza Manavi (ver otra respuesta) ha documentado varios de ellos en su blog.

 2
Author: dthorpe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-26 18:52:22

Su ejemplo no es una relación de muchos a muchos, es más una relación recursiva.

No estoy seguro de cómo arreglarlo. Pero el problema con su código es que obtendrá dos campos en la misma fila con el mismo nombre. MemberID para el id de la fila y MemberID para el id del amigo.

Editar

Intenta hacerlo así:

    class Member 
    { 
        [Key]
        public int MemberId { get; set; } 
        public string Name { get; set; }

        public virtual IList<FriendRelationship> Friends { get; set; } 

    }

    class FriendRelationship
    {
        [Key]
        public int RelationshipId { get; set; }

        public Member Friend { get; set; }
    }
 0
Author: Shiraz Bhaiji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-26 17:46:14