2010-06-30 34 views
9

¿Cómo se representa una relación de muchos a muchos en el CTP3 de Código EF4?Relación Muchos a Muchos en el Código Primero EF4

Por ejemplo si tengo las siguientes clases:

class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Profile> Profiles { get; set; } 
} 

class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

En la base de datos hay una tabla UserProfiles que tiene el FK para el usuario y el FK de perfil. ¿Cómo puedo mapear esto?

EDIT: Entiendo cómo mapear actualmente con tener una propiedad ICollection<User> en el Profile, pero realmente no quiero tener una propiedad de navegación opuesta cuando debería ser "Los usuarios tienen muchos perfiles".

Respuesta

8

EDITAR: CTP4 fue puesto en libertad ayer por la tarde (14 de julio de 2010) y ahora hay soporte para esto:

modelBuilder.Entity<Post>().HasMany(p => p.Tags).WithMany();


descubrí fin de que este momento no es posible. Microsoft está buscando agregar esta característica (solo una propiedad de navegación).

Ver este enlace en los foros de MSDN para obtener más información: http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/6920db2b-88c7-4bea-ac89-4809882cff8f

+3

Me alegra que finalmente hayan implementado esto. Me vi obligado a agregar propiedades de navegación no deseadas para evitar este problema. ¡Code-First está viniendo muy bien! – djskinner

+0

@Daniel - De acuerdo. – TheCloudlessSky

5

Con muchos a muchas relaciones que debe incluir las propiedades de navegación en ambos lados y hacerlos virtual (para utilizar la carga diferida)

class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Profile> Profiles { get; set; } 
} 

class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
} 

Luego con esa configuración puede definir su relación de muchos a muchos (también puede dejar que el marco de entidades lo haga por usted pero no me gustan las convenciones de nombres que usa).

 modelBuilder.Entity<Profile>(). 
      HasMany(p => p.Users). 
      WithMany(g => g.Profiles). 
      Map(t => t.MapLeftKey("ProfileID") 
       .MapRightKey("UserID") 
       .ToTable("UserProfiles")); 

Esto le dará una tabla llamada UserProfiles con UserID y ProfileID como Keys.

Cuestiones relacionadas