I have a base repository that looks like this:
public class BaseRepository<T> : IBaseRepository<T> where T : class { private DbContext _context; private IDbSet<T> _dbSet; protected DbContext Context { get { if (_context == null) { EFUnitOfWork currentUnitOfWork = (EFUnitOfWork)UnitOfWork.Current; _context = currentUnitOfWork.Context; } return _context; } } protected IDbSet<T> DbSet { get { if (_dbSet == null) { _dbSet = Context.Set<T>(); } return _dbSet; } } public void Add(T entity) { DbSet.Add(entity); } public void Attach(T entity) { DbSet.Attach(entity); } public void Delete(T entity) { DbSet.Remove(entity); } public void Update(T entity) { Context.Entry(entity).State = System.Data.EntityState.Modified; } public IQueryable<T> Get(string[] includes=null) { IQueryable<T> set = DbSet; if (includes != null) { foreach (string include in includes) { set = set.Include(include); } } return set; } User user = _usersRepository.Get().SingleOrDefault(u => u.Username == "gigi");This returns the user without the Roles property, which is ok.User user = _usersRepository.Get(new string[] { "Roles" }).SingleOrDefault(u => u.Username == "gigi");This returns the user and the Roles property, which is ok.List<User> users = _usersRepository.Get().Where(u => u.Username.StartsWith("gi")).ToList();List<User> users = _usersRepository.Get(new string[] { "Roles" }).Where(u => u.Username.StartsWith("gi")).ToList();
Query 3 and 4 both return a list of users with the Roles property. Why is query 3 returns Roles?
LE: This is the call, i examine the users collection after the context is disposed.
List<User> users = _usersRepository.Get().Where(u => u.Username.StartsWith("gi")).ToList(); UnitOfWork.Current.Dispose(); LE2: I did the same thing separately:
List<User> users; using (MyEntities ctx = new MyEntities ()) { users= ctx.Users.ToList(); }List<User> users; using (MyEntities ctx = new MyEntities ()) { users= ctx.Users.Include("Roles").ToList(); }
In the first case the Roles are not loaded, in the second they are which is ok.
I don't see what i am doing wrong in the repository sample.
LE3: This is the Unit of work
public class UnitOfWork { private const string HTTPCONTEXTKEY = "Repository.Key"; private static IUnitOfWorkFactory _unitOfWorkFactory; private static readonly Hashtable _threads = new Hashtable(); public static IUnitOfWork Current { get { IUnitOfWork unitOfWork = GetUnitOfWork(); if (unitOfWork == null) { _unitOfWorkFactory = ObjectFactory.GetInstance<IUnitOfWorkFactory>(); unitOfWork = _unitOfWorkFactory.Create(); SaveUnitOfWork(unitOfWork); } return unitOfWork; } } private static IUnitOfWork GetUnitOfWork() { if (HttpContext.Current != null) { if (HttpContext.Current.Items.Contains(HTTPCONTEXTKEY)) { return (IUnitOfWork)HttpContext.Current.Items[HTTPCONTEXTKEY]; } return null; } else { Thread thread = Thread.CurrentThread; if (string.IsNullOrEmpty(thread.Name)) { thread.Name = Guid.NewGuid().ToString(); return null; } else { lock (_threads.SyncRoot) { return (IUnitOfWork)_threads[Thread.CurrentThread.Name]; } } } } private static void SaveUnitOfWork(IUnitOfWork unitOfWork) { if (HttpContext.Current != null) { HttpContext.Current.Items[HTTPCONTEXTKEY] = unitOfWork; } else { lock (_threads.SyncRoot) { _threads[Thread.CurrentThread.Name] = unitOfWork; } } } }