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
Include
ySingleOrDefault
. 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,
Find
regresa inmediatamente sin hacer una solicitud a la tienda, si esa entidad ya está cargada por el contexto.fuente
Find
por 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 laSingleOrDefault
combinación conInclude
carga todo de una vez.Load
función, la relación debe rellenarse cuando vuelve la llamada. Entonces, si llamaLoad
varias veces para relaciones múltiples, habrá un viaje de ida y vuelta cada vez. Incluso para una sola relación, si elFind
método no encuentra la entidad en la memoria, realiza dos viajes de ida y vuelta: uno paraFind
y el segundo paraLoad
. Pero elInclude
.SingleOrDefault
enfoque 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