2012-01-07 78 views
8

Soy nuevo en LINQ to SQL y intento crear un Objeto de acceso a datos genérico (DAO) para los básicos Crear, Leer, Actualizar y Destruir (CRUD) métodos para que pueda reutilizar el código. Tuve éxito en la creación de un método genérico que eliminará cualquier entidad mediante el uso del siguiente código, pero me preguntaba si alguien sabe cómo crear un método genérico que seleccionará cualquier entidad mediante un campo Id común que exista en todas las tablas.Cómo crear objetos genéricos de acceso a datos (DAO) Métodos CRUD con LINQ to SQL

/// <summary> 
    /// Generic method that deletes an entity of any type using LINQ 
    /// </summary> 
    /// <param name="entity"></param> 
    /// <returns>bool indicating whether or not operation was successful</returns> 
    public bool deleteEntity(Object entity) 
    { 
     try 
     { 
      DomainClassesDataContext db = new DomainClassesDataContext(); 
      db.GetTable(entity.GetType()).Attach(entity); 
      db.GetTable(entity.GetType()).DeleteOnSubmit(entity); 
      db.SubmitChanges(); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.StackTrace); 
      return false; 
     } 
    } 

Estoy bastante seguro de que el mismo golpeteo trabajará para la actualización e inserte y le gustaría tener un método genérico en el GenericDAO que me va a recuperar cualquier entidad (es decir, al cliente, Factura, WorkOrder, etc ...) basado en las entidades Id. Gracias de antemano por las respuestas.

Respuesta

15

creo que busca Repository Pattern, la siguiente es una implementación sencilla de la misma:

En primer lugar es necesario crear una interfaz IRepository así:

public interface IRepository<T> where T : class 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    void Update(T entity); 
    IEnumerable<T> All(); 
    ... 
} 

continuación:

public class Repository<T> : IRepository<T> 
    where T : class, IEntity 
{ 
    DataContext _db; 
    public Repository() 
    { 
     _db = new DataContext("Database string connection"); 
     _db.DeferredLoadingEnabled = false; 
    } 
    public void Add(T entity) 
    { 
     if (!Exists(entity)) 
      GetTable.InsertOnSubmit(entity); 
     else 
      Update(entity); 
     SaveAll(); 
    } 
    public void Delete(T entity) 
    { 
     GetTable.DeleteOnSubmit(entity); 
     SaveAll(); 
    } 
    public void Update(T entity) 
    { 
     GetTable.Attach(entity, true); 
     SaveAll(); 
    } 
    System.Data.Linq.Table<T> GetTable 
    { 
     get { return _db.GetTable<T>(); } 
    } 
    public IEnumerable<T> All() 
    { 
     return GetTable; 
    } 
} 

Entonces:

public class CustomerRepository : Repository<Customer> 
{ 
    public ProductRepository() 
     : base() 
    { 
    } 
} 

A continuación, puede tener algo como:

Customer newCustomer = new Customer { FistName = "Foo", LastName = "Boo" }; 
_customerRepository.Add(newCustomer); 

Dónde Customer es una entidad asignada a su base de datos que se define en el .dbml. Esto es solo un comienzo. Consulte lo siguiente para obtener más información:

+0

Muchas gracias. Esto funciona perfectamente Solo he usado Hibernate con Java en el pasado y el framework ya estaba en su lugar. Ahora, soy el único desarrollador que trabaja en un proyecto desde cero, así que esta es la primera vez que tengo que escribir mi propia capa de acceso a datos fuera del equipo. Desearía tener suficientes representantes para votar esta solución. Soy nuevo en la comunidad y me aseguraré de votar esto cuando mi representante sea más alto. – Grasshopper

+0

@ Aaron Glade importante para ayudar y bienvenido a Stackoverflow, por cierto: puede marcar la respuesta como aceptada si le resultó útil ver esto: http://stackoverflow.com/faq#howtoask –

+0

@MahmoudGamal gran respuesta. ¿Es obligatorio usar una interfaz? No podemos simplemente definir una sola clase (Repositorio) y desde el método de Acción del controlador Agregar o Actualizar o Eliminar un registro. Gracias – User