2011-03-09 12 views
6

Tengo algo así como las siguientes tablas de relaciones de muchos a muchos.Código de EF Primero CTP5, usando el método Incluir con la tabla Muchos a muchos

public class Shop{ 
public int Id { get; set; } 
public virtual ICollection<ShopFacility> ShopFacilities { get; set; } 
} 

public class ShopFacility 
{ 
public int Id { get; set; }   
public int ShopId { get; set; } 
public int FacilityId { get; set; } 
public virtual Shop Shop { get; set; } 
public virtual Facility Facility { get; set; } 
} 

public class Facility 
{ 
public int Id { get; set; }   
public virtual ICollection<ShopFacility> ShopFacilities { get; set; } 
} 

y obtener información de tiendas.

using (var context = new DataContext()) 
{ 
return context.Shops.Include(s => s.ShopFacilities) 
        .Include("ShopFacilities.Facility") // This line 
        .First(x => x.Id == id); 
} 

Lo que quiero hacer es llamar al método Incluir con una expresión Lambda para una relación muchos a muchos en lugar de una cadena. Intenté implementar el siguiente código:

using (var context = new DataContext()) 
{ 
return context.Shops.Include(s => s.ShopFacilities) 
        .Include(s => s.ShopFacilities.Facility) // Cannot compile 
        .First(x => x.Id == id); 
} 

Pero como supongo no puedo compilarlo. En realidad, el primer fragmento de código funciona bien, así que, básicamente, está bien, sin embargo, tengo curiosidad por saber si hay una solución alternativa o no.

Cualquier ayuda se agradece,

Yoo

+2

Solo quería decir que realmente no necesita la clase ShopFacility. Su clase Shop puede tener un 'ICollection ' y su clase Facility puede tener un 'ICollection '. EF Code First comprenderá que necesita una relación de muchos a muchos. –

+2

Sé que el código EF primero es bastante inteligente, pero en realidad ShopFacility tiene otras propiedades como comentarios, tarifas, etc., así que tengo que tenerlo. Mis disculpas por no mencionarlo. ¡Gracias de todos modos! –

Respuesta

16

Prueba esto:

return context.Shops.Include(s => s.ShopFacilities.Select(f => f.Facility)) 
       .First(x => x.Id == id);  

pero se debe seguir lo @Kristof sugirió en el comentario.

+0

¡Gracias, eso funciona! –

+1

El método fuertemente tipado 'Include()' es un método de extensión, por lo que debe recordar declarar la instrucción 'using System.Data.Entity;'. – krzychu

Cuestiones relacionadas