C # Entity-Framework: ¿Cómo puedo combinar una .Find y .Include en un objeto modelo?

Estoy haciendo el tutorial de práctica de mvcmusicstore. Noté algo al crear el andamio para el administrador del álbum (agregar edición de eliminación).

Quiero escribir código de forma elegante, así que estoy buscando la manera más limpia de escribir esto.

FYI estoy haciendo que la tienda sea más genérica:

Álbumes = Artículos

Géneros = Categorías

Artista = Marca

Aquí se muestra cómo se recupera el índice (generado por MVC):

var items = db.Items.Include(i => i.Category).Include(i => i.Brand); 

Aquí se muestra cómo se recupera el elemento para eliminar:

 Item item = db.Items.Find(id); 

El primero trae todos los elementos y completa los modelos de categoría y 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 el hallazgo Y poblar lo que está dentro (preferiblemente en 1 línea) … teóricamente, algo así como:

 Item item = db.Items.Find(id).Include(i => i.Category).Include(i => i.Brand); 

Primero debe usar Include() y luego recuperar un solo objeto de la consulta resultante:

 Item item = db.Items .Include(i => i.Category) .Include(i => i.Brand) .SingleOrDefault(x => x.ItemId == id); 

La respuesta de Dennis es usar Include y SingleOrDefault . Este último realiza un viaje de ida y vuelta a la base de datos.

Una alternativa es usar Find , en combinación con Load , para la carga explícita de entidades relacionadas …

Debajo de un ejemplo de MSDN:

 using (var context = new BloggingContext()) { var post = context.Posts.Find(2); // Load the blog related to a given post context.Entry(post).Reference(p => p.Blog).Load(); // Load the blog related to a given post using a string context.Entry(post).Reference("Blog").Load(); var blog = context.Blogs.Find(1); // Load the posts related to a given blog context.Entry(blog).Collection(p => p.Posts).Load(); // Load the posts related to a given blog // using a string to specify the relationship context.Entry(blog).Collection("Posts").Load(); } 

Por supuesto, Find devuelve inmediatamente sin realizar una solicitud a la tienda, si esa entidad ya está cargada por el contexto.

No funcionó para mí Pero lo resolví haciendo esto.

 var item = db.Items .Include(i => i.Category) .Include(i => i.Brand) .Where(x => x.ItemId == id) .First(); 

No sé si esa es una buena solución. Pero el otro que Dennis dio me dio un error bool en .SingleOrDefault(x => x.ItemId = id);