DbContextで遅延ロードとプロキシ作成を無効にしました。私はRepository parternとUnitOfWorkを採用しています。私のUnitOfWorkはDBConextから継承しています。ここで私はやっているものの例である:DbContext.Setを呼び出す<T>().Include()は含まれているプロパティをクエリしていませんか?
public class User
{
public Guid Id {get;set;}
public virtual Guid UserTypeId {get;set;} //foreign key to UserType and setup in the EF fluent mappings and it does load if I am using lazy loading.
public virtual UserType {get;set;}
}
public class UserType
{
public Guid Id {get;set;}
public string Name {get;set;}
}
これは私のUOW内にある:
public IDbSet<TEntity> CreateSet<TEntity>() where TEntity : class
{
return base.Set<TEntity>();
}
私は私のリポジトリ経由でコンテキストを照会:だから
protected Expression<Func<TEntity, object>>[] Includes;
public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> criteria, params Expression<Func<TEntity, object>>[] includes)
{
Includes = includes;
return GetSet().Where(criteria)
.AsEnumerable();
}
public IDbSet<TEntity> GetSet()
{
var set = _unitOfWork.CreateSet<TEntity>();
if(Includes != null)
{
foreach (var include in Includes)
{
set.Include(include);
}
}
return set;
}
、することができますように私のクエリに含まれる式の配列を渡しているのを見てください。
var users = userRespository.Get(u => u.Id == SomeGuid, u => u.UserType);
のUserTypeがクエリに含まれていないと私は何を知らない。だから私はこのようにそれを呼び出すことができます。 DbContextでSet以外のものを呼び出すべきですか?
更新:
私はbase.Setを呼び出す前に、私はそこに含まれて追加する必要があるだろうと考えています。確かに。ところで
public IDbSet<TEntity> GetSet()
{
var set = _unitOfWork.CreateSet<TEntity>();
if(Includes != null)
{
foreach (var include in Includes)
{
set = set.Include(include);
}
}
return set;
}
:IQueryable
上
'set = set.Include(include);'? –
@LadislavMrnka、それについては決して考えなかった.....私はそれを試してみる... – DDiVita
@LadislavMrnka、あなたがその答えをしたいのなら、私はあなたにそれを与えるだろう。それは完璧です!!!! – DDiVita