如何使用LINQ to SQL创建通用数据访问对象(DAO)CRUD方法

时间:2012-01-07 02:18:52

标签: c# linq linq-to-sql crud dao

我是LINQ to SQL的新手,并尝试为基本的创建,读取,更新和销毁(CRUD)方法创建通用数据访问对象(DAO),以便我可以重用代码。我成功地创建了一个通用方法,它将使用下面的代码删除任何实体但是,我想知道是否有人知道如何创建一个通用方法,它将通过所有表中存在的公共Id字段选择任何实体。

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

我很确定相同的模式将适用于更新和插入,并希望在GenericDAO上有一个通用方法,它将检索我基于的任何实体(即客户,发票,工作订单等...)实体Id。提前感谢您的回复。

1 个答案:

答案 0 :(得分:17)

我认为您正在寻找Repository Pattern,以下是它的简单实现:

首先,你需要像这样创建一个接口IRepository

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

然后:

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

然后:

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

然后你可以有类似的东西:

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

其中Customer是映射到数据库的实体,在.dbml中定义。这只是一个开始,请参阅以下内容以获取更多详细信息: