2011-02-26 14 views
39

Me parece que no puede hacer este trabajo en absolutoreferencia a sí misma muchos-a-muchos código de relación recursiva primero Entity Framework

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

He intentado añadir Asignaciones pero en vano. ¿Hay alguna manera de hacerlo con CTP5?

+0

No creo que esto se relacione con el código primero, pero consulte [esta publicación] (http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/05198b97-f178-49ba-91da-7a2516a9ad8d) fuera. –

Respuesta

56

Por convención, Código primera tendrá asociaciones unidireccionales como uno a muchos. Por lo tanto es necesario utilizar API fluida para permitir Código Primero saber que usted quiere tener una asociación de muchos a muchos autorreferenciados:

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

Nota: No es un error conocido en CTP5 que no va a permitir la personalización de la unión nombres de columnas de tabla en este escenario.

+2

Morteza, te he estado siguiendo aquí y en tu blog. Esto funciona a la perfección! aunque la tabla resultante se llama [MemberMembers], lo cual es extraño, pero se solucionará en el RTM. ¡Gracias amigo! – Korayem

+0

hola, necesito saber cómo podemos usar la autorreferenciación múltiple. por ejemplo, en el mismo código de muestra; public virtual IList Amigos {get; conjunto; } public virtual IList Padres {get; conjunto; } –

+0

Esto funcionó perfectamente, gracias. ¿Conoces alguna para especificar el nombre de la tabla de muchos a muchos que creará? La cosa MemberMembers funciona bien, pero se ve feo. –

0

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

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

Editar

trata de hacerlo de esta manera:

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

Para mí puede ser muchas porque se puede resolver introduciendo una tabla [Amigos] con [LeftMemberId] y [RightMemberId]. Independientemente de la correcta asignación de nombres, no puedo hacer que esto funcione :( – Korayem

+0

Gracias amigo, no me dieron un cambio para probar su solución, pero esa fue mi solución inicial para hacerlo manualmente. No puedo esperar para el RTM :) – Korayem

2

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

+0

Cierto. Hope RTM cumple con nuestras solicitudes. ¡Code-first es simplemente increíble! – Korayem

16

Si estoy en lo correcto puede influir en la de muchos a muchos nombre de la tabla 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"); 
     } 
    ); 
} 

esperanza esto ayuda.

Cuestiones relacionadas