このリポジトリパターンを動作させる方法を理解するのに少し問題があります。一言で言えば遅延読み込みのためオブジェクトが読み込まれません。 BLLからすべてのオブジェクトを返す方法
、私の解決策は、次のようになります...
ASP.Net MVC
^
|
Business Logic
^
|
Data Access
(Repositories and Unit of Work)
^
|
Entity Framework Models
私はロールテーブルを参照して、ユーザーテーブルを持っています。
私のMVCアプリケーションでは、私はGetAllUsersでBLLを呼び出します。 BLLのコードは次のようになります。
public List<User> GetAllUsers()
{
using (UnitOfWork uow = new UnitOfWork())
{
UserRepository userRepository = new UserRepository(uow);
return userRepository.GetAll().ToList();
}
}
UserRepositoryがGETALLを(持っているGenericRepositoryから派生)
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
private IUnitOfWork _uow = null;
public GenericRepository(IUnitOfWork uow)
{
_uow = uow;
}
public virtual IQueryable<T> GetAll()
{
return _uow.Set<T>().AsQueryable();
}
}
それは私のMVCアプリケーションにユーザーのリストを返しますが、私がしようとすると、役割参照にアクセスすると、遅延読み込みのためにまだロードされていません。
public ActionResult Index()
{
BusinessLogic.Account blAcct = new BusinessLogic.Account();
List<User> users = blAcct.GetAllUsers();
string firstName = users.FirstName; // Works fine
string role = users.Roles.RoleName; // Fails because the context is closed.
return View();
}
私はGetAllUsersに.INCLUDE(役割)を置くことを試みたが、.INCLUDEはIQueryableを使用できません。
MVCアプリケーションがコンテキストやデータアクセスについて何も知る必要がないと考えるのは理論的には言えますか? そして、BLLを離れる前に、このロールの参照をグラフにどのように含める必要がありますか?
私は喜んでこれを行いますが、私のUserRepositoryでもIQueryableを使用しており、コンテキストにアクセスすることはできません。コンテキストは、作業単位で完全に制御されます。おそらく、UoWとリポジトリがどのように構築されているのかを再考する必要があります。 – Scottie
'UoW'クラスを介して' DataContext'を公開メソッドとして公開メソッドとして公開することができます。これはコードのにおいのように感じます。 – xandercoded
もう一つのオプションは、リポジトリに 'DataContext'を(コンストラクタを介して)受け取り、' IoCコンテナ 'を使ってリポジトリに注入させることです。 'Retrieating'、' Insert'、 'Deleting'ではなく、' Retrieval'の間だけこのコンテキストを使用します – xandercoded