web-dev-qa-db-ja.com

複数のテーブルMVCにデータを挿入する最良の方法ASP

4つのテーブルがあります。 OperationTable、ClientTable、ClientDetails、OperationRes

ClientTable

  • クライアントID
  • 名前
  • お誕生日
  • VerNumber

ClientDetails

  • クライアントID
  • Eメール
  • 住所
  • 電話

OperationTable

  • OperationID
  • 日付
  • 時間
  • クライアントID

OperationRes

  • ResID
  • OperationID
  • 名前
  • タイプ
  • 番号

私はクライアントにsmthに登録するためのフォームに記入するように求めるページがあります。すべてが1つのページになければならず、クライアントがフォームを送信した後、すべてのデータをそのテーブルに挿入する必要があります。 OperationTableの日付と時刻、ClientTableの名前と姓など。私はASP.NET MVCの新人です。 「Code Fisrt」を使ってみました。モデルを作成し、それを使用してビューとコントローラーを自動生成しました。しかし、それは私が欲しいものではありません。私はこれを見つけました チュートリアル 。できます!しかし、私は4つ以上のテーブルを持っています。最良の解決策は何ですか?

11
DSI

挿入するすべてのデータを保持するビューモデルが必要な場合は、コントローラーでそのビューモデルに基づいてオブジェクトを作成し、EFを使用して挿入します。何かのようなもの:

public class MyViewModel
{
    public string Name {get; set;}
    public string Birthday {get; set;}
    public string VerNumber { get; set;}
    public string Email {get; set;}
    public string Address {get; set;}
    // etc etc for the rest of your data
}

次に、コントローラーで、ViewModelを使用してエンティティを設定し、EFを使用して挿入します。

[HttpPost]
public ActionResult Add(MyViewModel model)
{
     var client = new Client{
          Name = model.Name,
          Birthday = model.Birthday
     };

     var clientDetails = new ClientDetails();

     //etc for your other entities

     using (var context = new MyDbContext)
     {
          context.Clients.Add(client);
          clientDetails.ClientId = client.Id;
          context.ClientDetails.Add(clientDetails);
          //etc add your other classes
          context.SaveChanges();

     }

     //whatever you want to do here for the result, maybe direct to new controller
     //or return view
     return View();

}

Repository Pattern を使用してエンティティフレームワークのコードを整理することを検討することをお勧めします。また、ビューモデルからエンティティをマップするために automapper を確認して、手動で実行することを保存することもできます。

18
LightningShield

論理的には、操作はチュートリアルショーとまったく同じになります。 4つのテーブルフィールドすべてを含むViewModelを作成する必要があるだけです。

次に、フォームがポストバックするときに、ViewModelのどのフィールドがどのテーブルのモデルに移動するかを決定するロジックを実行します。次に、そのテーブルモデルを保存します。

チュートリアルでは、1つのViewModel(LoginViewModel)を使用し、2つのテーブル(Login、User)に保存します。あなたの場合、4(OperationTable、ClientTable、ClientDetails、OperationRes)に保存するだけです。

3
Alan Tsai