2009-08-01 11 views
1

Comment réaliser une opération générique d'enregistrement et de mise à jour en utilisant des génériques et des réflexions en C#?C# - Opération CRUD générique

J'ai obtenu des données récupérer en utilisant une référence de here...

Je n'ai pas beaucoup de temps pour apprendre des technologies telles que NHibernate/LINQ/Entité Frameowrk, etc. pour ce moment. J'ai besoin d'une solution rapide pour ce problème pour une raison quelconque.

+1

Je vais vous décevoir - ce n'est * pas * le genre de problème avec des solutions rapides. –

Répondre

4

Je pense que vous seriez mieux d'utiliser un ORM - LINQ to SQL, LINQ to Entities, LINQ to nHibernate - plutôt que de réinventer tout cela. Essentiellement, ce que vous demandez de faire a déjà été fait pour vous dans ces cadres/technologies. Mon conseil est de prendre le temps d'apprendre sur les outils qui existent déjà et d'appliquer votre énergie créative pour ajouter de la valeur à votre application, en utilisant les outils déjà développés pour le travail quotidien. À moins, bien sûr, que vous cherchiez à implémenter un ORM parce que les existants sont inadaptés à vos besoins. Je suppose que ce n'est pas le cas, sinon vous savez déjà comment utiliser la réflexion pour faire ce que vous demandez.

+0

plz voir la mise à jour. –

+0

Dans mon expérience, apprendre à utiliser LINQ-to-SQL est plus rapide que d'écrire votre propre mécanisme basé sur la réflexion pour faire CRUD. Essentiellement, vous faites glisser vos tables sur la surface du concepteur et utilisez le contexte/les entités créés. Vous devrez ajouter votre logique métier, mais vous pouvez le faire avec des implémentations de classe partielles sur les entités. – tvanfosson

0

Utilisez une aide DBContext de GenericType

public class ContextHelper<T> : IContextHelper<T> 
    { 
     //Instantiate your own EntityFrameWork DB context here, 
     //Ive called the my EntityFramework Namespace 'EF' and the context is named 'Reporting' 
     private EF.DataContext DbContext = new EF.DataContext(); 
     public bool Insert<T>(T row) where T : class 
     { 
      try 
      { 
       DbContext.Set<T>().Add(row); 
       DbContext.SaveChanges(); 
       return true; 
      } 
      catch(Exception ex) 
      { 
       return false; 
      } 
     } 
     public bool Update<T>(T row) where T : class 
     { 
      try 
      { 
       DbContext.Set<T>().AddOrUpdate(row); 
       DbContext.SaveChanges(); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 
     public bool Delete<T>(T row) where T : class 
     { 
      return Update(row); //Pass an entity with IsActive = false and call update method 
     } 
     public bool AddRows<T>(T[] rows) where T : class 
     { 
      try 
      { 
       DbContext.Set<T>().AddOrUpdate(rows); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 

Et puis instancier et appeler la classe ici

public class MainLogicClassExample //Catty out logi operations on objects and update DataBase 
{ 
    public void NewEmailRecipient(EF.EmailRecipient recipient) 
    { 
     // logic operation here 

     EntityToDB(recipient); 
    } 
    public void NewReportRecipient(EF.ReportRecipient recipient) 
    { 
     // logic operation here 

     EntityToDB(recipient); 
    } 
    public void UpdateEmailRecipient(EF.EmailRecipient recipient) 
    { 
     // logic operation here 

     UpdateEntity(recipient); 
    } 

    public void UpdateReportRecipient(EF.ReportRecipient recipient) 
    { 
     // logic operation here 

     UpdateEntity(recipient); 
    } 
    // call generic methods to update DB 
    private void EntityToDB<T>(T entity) where T : class 
    { 
     var context = new ContextHelper<T>(); 
     context.Insert(entity); 
    } 

    private void UpdateEntity<T>(T entity) where T : class 
    { 
     var context = new ContextHelper<T>(); 
     context.Update(entity); 
    } 
} 

J'ai ajouté un DemoProject à GitHub ici: https://github.com/andyf1ynn/EntityFramwork-Generic-Type-DAL