ASP.NET MVC 2 と Entity Framework を使用して、初めての Web アプリケーションを構築中です。リポジトリ パターンを使用しています。Stack Overflow や他の Web サイトで収集した情報によると、コンセンサスは、ドメイン モデル オブジェクトごとに 1 つのコントローラーと、集約ルート オブジェクトごとに 1 つのリポジトリーを持つことです。
問題は、集約ルート リポジトリを介して非ルート集約オブジェクトにアクセスする方法です。私が扱っている例では、Customer モデルと Boat モデルがあります。ボートは顧客への FK 参照でのみ存在でき、ボートは顧客のコンテキスト内でのみ参照する必要があります。これにより、これら 2 つのオブジェクトを含む集約があり、Customer がルートであると信じるようになりました。
これで、Boats コントローラーに Edit アクション メソッドがあります。
public class BoatsController : Controller
{
private ICustomersRepository customersRepository;
public BoatsController(ICustomersRepository customersRepository)
{
this.customersRepository = customersRepository;
}
public JsonResult Edit(int id, FormCollection collection)
{
var boat = customersRepository.GetBoat(id);
// Update boat
}
}
私の質問は、リポジトリ内の Boat オブジェクトを取得するにはどうすればよいですか?
public class SQLCustomersRepository : ICustomersRepository
{
DatabaseEntities db = new DatabaseEntities();
public Boat GetBoat(int id)
{
return db.Boats.SingleOrDefault(x => x.ID == id);
// OR
return db.Customers.Where(x => x.Boats.Any(y => y.ID == id)
.Select(x => x.Boats.FirstOrDefault(y => y.ID == id);
}
}
Customers リポジトリから db.Boats を参照することはできますか? これは最もクリーンなように思えますが、FakeCustomersRepository を変更して顧客とボートのリストを作成する必要があることを意味します。
db.Customers を介してボートにアクセスする方が合理的に思えましたが、LINQ クエリで自分自身を繰り返さずに単一のボート オブジェクトを返す方法がわかりませんでした。
まだ学ぶべきことがたくさんあることはわかっているので、正しい方向に向けていただければ幸いです。
ありがとう!