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