2013-04-30 21 views
7

私はASP.net MVCを初めて使用しています。ほとんどの人に推奨されているので、ビューバッグではなくviewmodelを使用してドロップダウンを設定しています。私はドロップダウンとオートコンプリート(ここには表示されていません)をカスケードする滑らかなUIを持っていますが、データをデータベースに戻すことができません。ASP.NET MVCでViewModelデータをデータベースに保存

モデル:

public partial class Car 
    { 
     public int CarID { get; set; } 
     public string CarName { get; set; } 
     public int ModelID { get; set; } 
     public int ManufacturerID { get; set; } 
     public int CarColorID { get; set; } 
     public Nullable<decimal> Price { get; set; } 
     public string Description { get; set; } 

     public virtual CarColor CarColor { get; set; } 
     public virtual Manufacturer Manufacturer { get; set; } 
     public virtual CarModel CarModel { get; set; } 
    } 
    public partial class CarColor 
    { 
     public CarColor() 
     { 
      this.Cars = new HashSet<Car>(); 
     } 

     public int ColorID { get; set; } 
     public string ColorName { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
    } 
    public partial class CarModel 
    { 
     public CarModel() 
     { 
      this.Cars = new HashSet<Car>(); 
     } 

     public int CarModelID { get; set; } 
     public int ManufacturerID { get; set; } 
     public string CarModelName { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
     public virtual Manufacturer Manufacturer { get; set; } 
    } 
    public partial class Manufacturer 
    { 
     public Manufacturer() 
     { 
      this.Cars = new HashSet<Car>(); 
      this.Manufacturer1 = new HashSet<Manufacturer>(); 
      this.CarModels = new HashSet<CarModel>(); 
     } 

     public int ManufacturerID { get; set; } 
     public string ManufacturerName { get; set; } 
     public Nullable<int> ParentID { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
     public virtual ICollection<Manufacturer> Manufacturer1 { get; set; } 
     public virtual Manufacturer Manufacturer2 { get; set; } 
     public virtual ICollection<CarModel> CarModels { get; set; } 
    } 

のViewModel:

コントローラー:

public ActionResult Create() 
     { 
      var model = new AnotherTestViewModel(); 
      using (new CarTestEntities()) 
      { 
       model.CarModels = db.CarModels.ToList().Select(x => new SelectListItem 
       { 
        Value = x.CarModelID.ToString(), 
        Text = x.CarModelName 
       }); 
       model.Manufacturers = db.Manufacturers.ToList().Select(x => new SelectListItem 
       { 
        Value = x.ManufacturerID.ToString(), 
        Text = x.ManufacturerName 
       }); 
       model.CarColors = db.CarColors.ToList().Select(x => new SelectListItem 
       { 
        Value = x.ColorID.ToString(), 
        Text = x.ColorName 
       }); 
      } 
      return View(model); 
     } 

     // 
     // POST: /AnotherTest/Create 

     [HttpPost] 
     public ActionResult Create(AnotherTestViewModel model) 
     { 
       if (ModelState.IsValid) 
       { 
        db.Entry(model).State = EntityState.Modified; 
        db.SaveChanges(); 
        return RedirectToAction("Details", "AnotherTestViewModel", new { id = model.car.CarID }); 
       } 
       return View(); 
     } 

私はEntityState.Modifiedが動作しませんので、Automapperを使用するには、いくつかの提言を見たが、私以下のコードを使用しても動作しなかったので、どのように設定するのか分かりません。

Mapper.CreateMap<AnotherTestViewModel, Car>(); 
Mapper.CreateMap<Car, AnotherTestViewModel>(); 
var newCar = Mapper.Map<AnotherTestViewModel, Car>(model); 

答えて

21

あなたのビューモデルはデータベースと対話してはいけません。ビューモデルは、プレゼンテーションレイヤー(ユーザーインターフェイス)でのみ使用する必要があります。したがって、「ビュー」モデルという用語を使用してください。データベースと対話する別のモデル(データモデル)が必要です。次に、ビューモデルとデータモデルの間の変換を処理するサービスレイヤーを用意する必要があります(逆もまた同様です)。あなたのデータモデルは、Entity Frameworkによって生成されたモデルです(あなたが使用していると仮定しています)。データベースの更新を処理するには、データコンテキストをインスタンス化し、データベースからデータエンティティを取得し、そのエンティティに変更を加え、そのデータコンテキストの変更をすべて保存する必要があります。データコンテキストは、エンティティへのすべての変更を追跡し、「変更を保存」するときにデータベースに必要な変更を適用します。 例:この例では

public void UpdateCar(CarViewModel viewModel) 
{ 
    using (DataContext context = new DataContext()) 
    { 
     CarEntity dataModel = context.CarEntities.where(x => x.Id == viewModel.Id).First(); 

     dataModel.Name = viewModel.Name; 
     dataModel.Type = viewModel.Type; 

     context.SaveChanges(); 
    } 
} 

、コンテキストは、「データモデル」への変更を追跡します。 "context.SaveChanges"が呼び出されると、それらの変更は自動的にデータベースに適用されます。

+0

ありがとうございました!それはまさに私が必要とした助けでした。 – Jim

+0

この "UpdateCar"機能はどこにありますか?あなたは、ある種の「サービス層」の中で、あなたはもっと正確に言えますか?ありがとう! – crunchy

+0

サービスは実際にUIについて何も知ってはいけません。したがって、ドメイン/データモデルへのこの変換は、コントローラで行う必要があります。次に、更新を実行するサービスレイヤメソッドにドメイン/データモデルを渡します。 – RiceRiceBaby

関連する問題