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

Posted

技术标签:

【中文标题】如何使用 LINQ to SQL 创建通用数据访问对象 (DAO) CRUD 方法【英文标题】:How To Create Generic Data Access Object (DAO) CRUD Methods with LINQ to SQL 【发布时间】:2012-02-04 17:04:17 【问题描述】:

我是 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】:

我想你在找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 中定义。这只是一个开始,更多详情请参见以下内容:

Implementing Repository Pattern in LINQ-to-SQL。 LINQ to SQL and Repository Pattern. Implementing IRepository Pattern in LINQ to SQL。 Implementation example of Repository Pattern in LINQ to SQL.

【讨论】:

非常感谢。这完美地工作。我过去只在 Java 中使用过 Hibernate,并且框架已经到位。现在,我是从头开始从事项目的唯一开发人员,所以这是我第一次不得不在团队之外编写自己的数据访问层。我希望我有足够的代表来投票支持这个解决方案。我是社区的新手,当我的代表更高时一定会投票支持。 @AaronMajor Glade 提供帮助并欢迎使用 ***,顺便说一句:如果您发现它有帮助,您可以将答案标记为已接受,请参阅:***.com/faq#howtoask @MahmoudGamal 很好的答案。是否必须使用接口,我们不能只定义一个类(存储库)并从控制器的 Action 方法添加或更新或删除记录。谢谢 @User - 不,这不是强制性的,但是接口作为通用存储库工作,它具有接口而不是直接使用类的优点,例如,如果特定存储库需要额外的操作,你可以扩展通用存储库接口。通常,这取决于您的设计和要求,还请阅读有关类和接口以及何时应该选择其他的更多信息。 @MahmoudGamal 感谢您的回答,感谢您的帮助。根据此链接programmers.stackexchange.com/questions/180851/… Entity Framework 已经实现了存储库模式,我确实还有一个疑问,那么如果是这种情况,我不能使用我自己的存储库,以便我可以减少编码。需要您的善意建议并感谢您的时间和耐心。

以上是关于如何使用 LINQ to SQL 创建通用数据访问对象 (DAO) CRUD 方法的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to SQL模型 是啥意思

Linq to Sql-我可以构建一个通用的更新操作吗?

使用 SQL Server Compact Edition 的 Linq-to-SQL

使用 Linq To SQL 时,我是不是应该在 BLL 类中使用数据访问和业务逻辑

数据访问层 - LINQ-To-SQL 和泛型。我可以优化这个吗?

使用 LINQ to SQL,其中数据库表可以有额外的列