Project Description
Transactional data access layer using UnitOfWork and Repository patterns against IQueriables.
Key features:
- loose coupled from the Entity Framework, query against an interface, not against the ObjectSet.
- fast through precompiled queries
- generic repositories
- generates plain pocos
- strongly typed includes, no strings anymore!
- dependent transactions spanning multiple threads
- multiple nested unit of works sharing one transaction
- easy transaction/datacontext management
- almost no code needed to start working with repositories
Code samples
Declaring a precompiled query with typed include
public class ProductListByNameQuery : Query<INQueriesSample, string, IEnumerable<Product>>
{
protected override Expression<Func<INQueriesSample, string, IEnumerable<Product>>> Expression
{
get
{
return (context, name)
=> from product in context.Products
.Include(x => x.Category)
where product.Name.Contains(name)
orderby product.Name
select product;
}
}
}
Consuming a compiled query
using (UnitOfWork.Begin())
{
IEnumerable<Product> products = new ProductList().Execute("c#");
}
Repositories and updates within a transaction
Of course it is still possible to query dynamically in your code, without using precompiled queries.
using (IUnitOfWork unitOfWork = UnitOfWork.Begin(TransactionScopeOption.Required))
{
IRepository<Product> productRepository = unitOfWork.GetRepository<Product>();
Product product = productRepository.Single(x => x.Id == id);
product.Name = "c#";
unitOfWork.Commit();
}