10 people following this project (follow)

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

Last edited Mar 15 2011 at 4:42 PM by Ymris, version 28