2012-03-22 36 views
5

hace unos días leí un tutorial sobre GenericRepository y Unit of Work patrones http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application. Uso formularios web y tengo el paquete EntityFramework CTP4 instalado. (No puedo usar EF 5).EntityFramework 4, DbSet y ObjectContext

Quiero repositorio de código genérico para mi proyecto, pero me he quedado atrapado en esta línea:

this.dbSet = context.Set<TEntity>(); 

sé que esta línea no funciona debido a un uso ObjectContext en mi proyecto y el primer acercamiento de base de datos. ¿Cómo puedo lidiar con eso? ¿Puedo codificar el repositorio genérico sin migración al código primero (que no es una opción en mi caso)?

Respuesta

7

Esto es el equivalente de ObjectContext:

this.dbSet = context.CreateObjectSet<TEntity>(); 

Ahora bien, esto crea un ObjectSet<TEntity> en lugar de un DbSet<TEntity>, pero por su patrón se puede utilizar de la misma manera.

ACTUALIZACIÓN

La clase ObjectSet no tiene un método de utilidad como que coincide con el método de la DbSetFind(). Para "Obtener por clave" necesitaría construir un EntityKey y usar el ObjectContext.GetEntityByKey(), desafortunadamente eso no es algo realmente simple de hacer.

Realmente no hay una manera simple de abordar esto, que he encontrado. En mi caso, lo que he hecho es basar todas mis entidades de una clase común (usando plantillas T4 personalizadas para generar las clases del modelo). Y entonces puedo agregar una restricción genérica a mis repositorios, como:

public class MyRepository<TEntity> where TEntity : MyEntityBaseClass 

y luego mi clase base común tiene un campo Id que se hereda por todas las entidades para que pueda simplemente puede hacer:

return myObjectSet.SingleOrDefault(x => x.Id == myId); 

Estoy seguro de que hay otros enfoques, que podrían ser un buen tema para otra pregunta.

+0

Gracias por su ayuda. Ahora esto crea un ObjectSet en lugar de un DbSet , pero para su patrón puede usarlo de la misma manera. Tengo un problema con el método de búsqueda en esta línea: dbSet.Find (id); ¿Cómo puedo codificar esto usando ObjectSet? – mrrobot

+0

así que si Find by Id en ObjectSet es tan difícil ¿por qué no usaste DbContext? Me pregunto cuál de este método debo usar, intentar crear el método de búsqueda como usted o tal vez debería usar DbContext? Hasta ahora, no he escrito mucho código en este proyecto, así que tal vez sea mejor idea utilizar DbContext. ¿Podrías dar tu opinión al respecto? Gracias – mrrobot

+0

En el momento en que comencé mi aplicación, EF Code First aún no se había lanzado. Según la respuesta de Ropstah, parece que hay plantillas que puede usar para generar clases de estilo Code First para las aplicaciones Model First o Database First. Nunca he intentado ese enfoque, así que realmente no puedo decir si funciona o no. – CodingGorilla

4

1. desea agregar la plantilla DbContextGenerator a las plantillas de Visual Studio:

DbContextGenerator template

2. Después de esto, asegúrese de que se borre la herramienta de generación por defecto en el archivo de .edmx.

Code generation tool

3. Ahora puede implementar el patrón GenericRepository como desee.

Cuestiones relacionadas