static void

EF Code First Generic Repository

Arguably DbSet (or at least IDbSet) is minimal enough to use directly, but here's a generic repository that hides the EF dependency. It's based on the Nuget MvcScaffolding repository template and this asp.net tutorial.
The AddOrUpdate and Delete method use DbContext Extensions.

This is probably an anti-pattern. Either provide specific RPC or Command/Query methods or expose NHibernate or EF directly.

using System;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
 
namespace Domain
{
    public class GenericRepository<T> : IGenericRepository<T>
        where T : class
    {
        readonly DbContext _context;
 
        public GenericRepository(DbContext context)
        {
            _context = context;
        }
 
        public IQueryable<T> Get
        {
            get { return _context.Set<T>(); }
        }
 
        public IQueryable<T> GetIncluding(params Expression<Func<T, object>>[] includeProperties)
        {
            IQueryable<T> query = _context.Set<T>();
            foreach (var includeProperty in includeProperties)
            {
                query = query.Include(includeProperty);
            }
            return query;
        }
 
        public T Find(object[] keyValues)
        {
            return _context.Set<T>().Find(keyValues);
        }
 
        public void Add(T entity)
        {
            _context.Set<T>().Add(entity);
        }
 
        public void Update(T entity)
        {
            var entry = _context.Entry(entity);
            if (entry.State == EntityState.Detached)
            {
                _context.Set<T>().Attach(entity);
                entry = _context.Entry(entity);
            }
            entry.State = EntityState.Modified;
        }
 
        public void AddOrUpdate(T entity)
        {
            //uses DbContextExtensions to check value of primary key
            _context.AddOrUpdate(entity);
        }
 
        public void Delete(object[] keyValues)
        {
            //uses DbContextExtensions to attach a stub (or the actual entity if loaded)
            var stub = _context.Load<T>(keyValues);
            _context.Set<T>().Remove(stub);
        }
    }
}
 
 

Interface

using System;
using System.Linq;
using System.Linq.Expressions;
 
namespace Domain
{
    public interface IGenericRepository<T> where T : class
    {
        IQueryable<T> Get { get; }
        IQueryable<T> GetIncluding(params Expression<Func<T, object>>[] includeProperties);
        T Find(object[] keyValues);
        void Add(T entity);
        void Update(T entity);
        void AddOrUpdate(T entity);
        void Delete(object[] keyValues);
    }
}