C# - 通用CRUD操作

时间:2009-08-01 15:35:59

标签: c# generics reflection ado.net

如何在C#中使用泛型和反射实现通用的保存和更新操作?

我使用here...

中的一些引用实现了数据检索

我现在没有太多时间学习NHibernate / LINQ / Entity Frameowrk等技术。出于某种原因,我需要快速解决这个问题。

2 个答案:

答案 0 :(得分:4)

我认为你最好使用ORM - LINQ to SQL,LINQ to Entities,LINQ to nHibernate - 而不是重新发明所有这些。从本质上讲,您在这些框架/技术中已经为您做过的建议。我的建议是花一些时间了解已经存在的工具,并利用已经开发的平常工作工具,将您的创造力用于为您的应用程序增加价值。当然,除非您正在寻求实施ORM,因为现有的ORM不足以满足您的需求。我怀疑情况并非如此,否则你已经知道如何使用反射来做你想要的事情。

答案 1 :(得分:0)

使用GenericType的DBContext帮助程序

 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;
            }
        }

然后在这里实例化并调用该类

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);
    }
}

我在这里向gitHub添加了一个DemoProject: https://github.com/andyf1ynn/EntityFramwork-Generic-Type-DAL