Estoy haciendo el tutorial de práctica mvcmusicstore. Noté algo al crear el andamio para el administrador de álbumes (agregar, eliminar, editar).
Quiero escribir código con elegancia, así que estoy buscando la forma limpia de escribir esto.
FYI estoy haciendo la tienda más genérica:
Álbumes = Artículos
Géneros = Categorías
Artista = Marca
Así es como se recupera el índice (generado por MVC):
var items = db.Items.Include(i => i.Category).Include(i => i.Brand);
Así es como se recupera el elemento para eliminar:
Item item = db.Items.Find(id);
El primero recupera todos los artículos y completa la categoría y los modelos de marca dentro del modelo de artículo. El segundo, no llena la categoría y la marca.
¿Cómo puedo escribir el segundo para hacer la búsqueda Y llenar lo que hay dentro (preferiblemente en 1 línea) ... en teoría, algo como:
Item item = db.Items.Find(id).Include(i => i.Category).Include(i => i.Brand);
c#
asp.net-mvc
entity-framework
Ralph N
fuente
fuente

Respuestas:
Include()Primero debe usar , luego recuperar un solo objeto de la consulta resultante:fuente
La respuesta de Dennis es usar
IncludeySingleOrDefault. Este último va de ida y vuelta a la base de datos.Una alternativa es usar
Find, en combinación conLoad, para la carga explícita de entidades relacionadas ...Debajo de un ejemplo de MSDN :
Por supuesto,
Findregresa inmediatamente sin hacer una solicitud a la tienda, si esa entidad ya está cargada por el contexto.fuente
Findpor lo tanto, si la entidad está presente, no hay ida y vuelta a la base de datos para la entidad misma. PERO, tendrás un viaje de ida y vuelta para cada relación que estés teniendoLoad, mientras que laSingleOrDefaultcombinación conIncludecarga todo de una vez.Loadfunción, la relación debe rellenarse cuando vuelve la llamada. Entonces, si llamaLoadvarias veces para relaciones múltiples, habrá un viaje de ida y vuelta cada vez. Incluso para una sola relación, si elFindmétodo no encuentra la entidad en la memoria, realiza dos viajes de ida y vuelta: uno paraFindy el segundo paraLoad. Pero elInclude.SingleOrDefaultenfoque alcanza la entidad y la relación de una vez hasta donde yo sé (pero no estoy seguro)Tienes que lanzar IQueryable a DbSet
var dbSet = (DbSet<Item>) db.Set<Item>().Include("");return dbSet.Find(id);fuente
No funcionó para mí. Pero lo resolví haciendo así.
No sé si esa es una buena solución. Pero el otro que Dennis me dio me dio un error de bool en
.SingleOrDefault(x => x.ItemId = id);fuente
SingleOrDefault(x => x.ItemId = id)solo por el single incorrecto en=lugar del doble==?No hay una manera fácil de filtrar con un hallazgo. Pero he encontrado una forma cercana de replicar la funcionalidad, pero tenga en cuenta algunas cosas para mi solución.
Esta solución le permite filtrar genéricamente sin conocer la clave principal en .net-core
Buscar es fundamentalmente diferente porque obtiene la entidad si está presente en el seguimiento antes de consultar la base de datos.
Además, puede filtrar por un Objeto para que el usuario no tenga que conocer la clave principal.
Esta solución es para EntityFramework Core.
Aquí hay algunos métodos de extensión para agregar que lo ayudarán a filtrar por clave primaria
Una vez que tenga estos métodos de extensión, puede filtrar así:
fuente