2011-05-08 12 views
10

Recientemente vine por la clase ManyNavigationPropertyConfiguration<TEntity, TTarget> , y dentro de esa clase encontré un método llamado WithMany() con 2 sobrecargas.Código de EF Primero - WithMany()

El primer sobrecarga: WithMany()

Configura la relación sea muchos: muchos de ellos sin una navegación propiedad en el otro lado de la relación .

La segunda sobrecarga: WithMany(Expression<Func<TTarget, ICollection<TEntity>>>)

Configura la relación sea muchos: muchos de ellos con una propiedad de navegación en el otro lado de la relación.

Ahora es mi pregunta, ¿por qué configurar una relación para ser muchos: muchos sin una propiedad de navegación (la primera sobrecarga)? No veo ningún escenario donde eso sería útil ... ¿Alguna idea?

Respuesta

31

Un ejemplo podría ser este modelo:

public class User 
{ 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public ICollection<Role> Roles { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Description { get; set; } 
} 

Si usted nunca está interesado en obtener todos los usuarios que están en una función específica, añadiendo una propiedad de navegación ...

public ICollection<User> Users { get; set; } 

... a la clase Role sería una sobrecarga innecesaria.

Pero aún debe EF decir que existe una relación de muchos a muchos entre User y Role ...

modelBuilder.Entity<User>() 
      .HasMany(u => u.Roles) 
      .WithMany(); 

...porque las asignaciones de convenciones predeterminadas crearían una relación incorrecta, es decir, una relación de uno a varios, correspondiente a esta asignación:

modelBuilder.Entity<User>() 
      .HasMany(u => u.Roles) 
      .WithOptional(); 
4

Tenga en cuenta que la opción para una propiedad de navegación es en el otro lado del objetivo.

Veamos un ejemplo, aunque este caso específico podría no ser el ilustrador perfecto de mi punto ... Si desea realizar un seguimiento de las pruebas de matemáticas y volver a utilizar las preguntas, es posible que tenga dos tablas (Tests y Questions) que tienen una relación de muchos a muchos; cada prueba tiene varias preguntas, y cada pregunta puede aparecer en varias pruebas. Sin embargo, es posible que nunca necesite obtener un conjunto de pruebas sobre una pregunta específica, aunque sepa que las preguntas pueden aparecer en más de una prueba, no le interesa.
Por lo tanto, utiliza la sobrecarga .WithMany() al declarar esto, por lo que obtiene una propiedad de navegación para obtener las preguntas de una prueba (theTest.Questions()) pero ninguna propiedad de navegación a la inversa (theQuestion.Tests()). Pero aún necesita una relación de muchos a muchos, ya que tanto las pruebas como las preguntas pueden tener muchas de las otras.
Estoy de acuerdo que en este caso específico esta configuración podría no tener sentido, pero sin duda hay casos en los que opera, y en esos casos, la sobrecarga de .WithMany() le permite pasar sin definición de las propiedades (y una expresión lambda para cada uno de ellos) nunca lo necesitarás

Cuestiones relacionadas