私は次のようなベースリポジトリを持っています:
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");
これにより、Rolesプロパティのないユーザーが返されます。これは問題ありません。User user = _usersRepository.Get(new string[] { "Roles" }).SingleOrDefault(u => u.Username == "gigi");
これにより、ユーザーとRolesプロパティが返されます。これは問題ありません。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();
クエリ3と4はどちらも、Rolesプロパティを持つユーザーのリストを返します。クエリ3がロールを返すのはなぜですか?
LE:これは呼び出しです。コンテキストが破棄された後、ユーザーコレクションを調べます。
List<User> users = _usersRepository.Get().Where(u => u.Username.StartsWith("gi")).ToList();
UnitOfWork.Current.Dispose();
LE2:私は同じことを別々に行いました:
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(); }
最初のケースではロールがロードされていませんが、2番目のケースでは問題ありません。
リポジトリのサンプルで何が間違っているのかわかりません。
LE3:これは作業単位です
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;
}
}
}
}