2012-03-20 17 views
0

質問があります。この特定のビューのために3つのモデル、および1スーパーモデル: - 私は手に入れたいものをASP.NET MVC 3複数DBを使用した単一フォームへのモデル

まもなく

私の質問は、実際には1つthisからを拡張します。このスーパーモデルは、IENumerable、IENumerable、IENumerableを(適切に)塗りつぶしてViewパーツで使用します。 (私の知る限りそれを理解するように、少なくとも...)

この他のトピックダン・レヴェルで...

質問をverry素晴らしく、エレガントな解決策を提案したが、このソリューションは、DB自体からデータをフェッチしません。 "新しい"インスタンスコンストラクタからではなく、このモデルのデータをDBから取得するためには何が必要ですか?

このアプローチを使用している間に、DBContextからデータをフェッチしようとしました。私はDBContextをいつ作成するのか理解できません...またはアプリケーションによって作成されたものにアクセスする方法...

コントローラで強制的に作成しようとしました。

using (var Db = new thetaskermvc.Models.TaskerDBContext()) 
    { 
     var themodel = new thetaskermvc.Models.TotalView(); 
     //Jobbers 
     themodel.Jobberz = new Dictionary<int, thetaskermvc.Models.Jobbers>(); 
     var jobbers = from Jobbers in Db.Jobbers.OrderBy(g => g.jobb_name) select Jobbers; 
     foreach (Models.Jobbers ad in jobbers) 
     { 
      themodel.Jobberz.Add(ad.jobb_id, 
        new Models.Jobbers(ad.jobb_id, ad.jobb_name, ad.jobb_from, ad.jobb_carma, ad.jobb_status, ad.jobb_balance, ad.jobb_time)); 
     } 
     if (themodel.Jobberz.Count == 0) 
     { 
      themodel.Jobberz.Add(-1, new Models.Jobbers(0, "NOTHING FOUND",DateTime.Now,0,"",0,0)); 
     } 

    } 

しかし、コンテキストは、それが存在するのです停止し、そのように作成したとして、離れて、コントローラからデータを渡した後(?) - 私はそれを他の方法を使用することはできませんが、このコントローラ内のすべてのデータを取得するために、そして、モデルのデータを記入その中のコレクションに直接追加してください(IENumerableを使用すると、必要に応じてデータを取得できます)。

だから、もし難しくなければ、私に啓発してください。そういうアプローチを使うのはいいですか、それとも他の「共通の」方法がありますか? Becausそれは不器用だそばに - このアプローチは動作します...私はASPにかなり新しいよ、まだ

PS ...

答えて

3

私はone view model per viewに複数のテーブルからのデータを持っています(必要な場合)。私の見解では、2つの異なるデータベーステーブルからロードする必要があるデータがあります。私の行動、私は私の銀行や口座の種類を取り込む方法このように(ドロップダウンで使用される)を作成します(別のテーブル)で

private readonly IBankService bankService; 
private readonly IAccountTypeService accountTypeService; 

public GrantApplicationController(IBankService bankService, IAccountTypeService accountTypeService) 
{ 
    // Check incoming parameters for null values 

    this.bankService = bankService; 
    this.accountTypeService = accountTypeService; 
} 

:私の交付申請コントローラでは、私は以下の持っている

public ActionResult Create() 
{ 
    GrantApplicationCreateViewModel viewModel = new GrantApplicationCreateViewModel 
    { 
      Banks = bankService.FindAll(), 
      AccountTypes = accountTypeService.FindAll() 
    } 

    // Do what ever else you need to get done 

    return View(viewModel); 
} 

私の部分図のモデルは、この希望:私のリポジトリクラスで

public class GrantApplicationCreateViewModel 
{ 
    public int BankId { get; set; } 
    public IEnumerable<Bank> Banks { get; set; } 
    public int AccountTypeId { get; set; } 
    public IEnumerable<AccountType> AccountTypes { get; set; } 

    // Other properties 
} 

私はこのようなデータベースコンテキストを使用します(私はEntity Framework code firstを使用):

を私のデータベースコンテキストクラスで
public class BankRepository : IBankRepository 
{ 
    HefContext db = new HefContext 

    public IEnumerable<Bank> FindAll() 
    { 
      return db.Banks.OrderBy(x => x.Name); 
    } 
} 

public class HefContext : DbContext 
{ 
    public DbSet<Bank> Banks { get; set; } 
    public DbSet<AccountType> AccountTypes { get; set; } 
} 

それを使用すると、複数のソースからのデータを持っている1つのビューモデルを持つことができるこの方法を行います。これがあなたの質問に答えることを願っています詳細な説明が必要な場合は、私に教えてください:)

+0

完璧に私の質問に答える!私は何をすればいいのか正確に見ることができます:) ありがとう。 –

+0

ちょうど私の答えをマークすることを忘れないでください:) –

+1

偉大な答え。私は、インポートされたデータエンティティを使用している場合は、コントローラによるモデルの作成にLinqクエリを直接使用して、リポジトリをすべてスキップすることができると付け加えたいと思います。私は話している。](http://pastebin.com/vhgiNzyy) –

1

あなたはthis postを見てしたいことがあり、それは(サンプルプロジェクトで)説明理想的なMVCアプリケーションアーキテクチャはどのようにすべきか

上記のコードサンプルでは、​​コントローラ内にDbContextを参照しないでください。コントローラーの仕事は、DBに接続しないでモデル集団を実行する要求の流れを制御することです。

+0

コントローラーアクションでのDataAccessは、小規模プロジェクトでは問題ありません。問題は、永続モデルがビューモデルではないことです。 MVCのモデルは、ビューを表すモデルであるビューモデルです。これは、永続モデルやドメインモデルなどとは何の相関もありません。 – Phill

+0

はい、それは私が必要とするものです)「適切な」構造です。どうも。 –

+1

@DerZingerあなたが助けてくれたら、それを答えとして記入してください。 – amythn04

関連する問題