ASP.NET MVC + EF CodeFirstでリレーションのあるテーブルを更新する

投稿者: | 2014年9月21日

どういうわけか、ASP.NET MVCで開発するようになった訳ですが、はまったことをmemo
そもそも、まだ使い始めて1週間ぐらいなので、全然意味分からないままやってます。
なので、そういう前提で。

画像入れればわかりやすいけど、とりあえずmemoレベルで

「商品テーブル」と「商品価格テーブル」があって、One Manyのリレーションシップを作る
既存のアプリからの移行で、既存のDBはそれぞれ商品ID(主キー)、商品名と、
商品価格ID(主キー)、商品ID(外部キー)、販社ID、仕入価格がある。

その状態で、ASP.NET MVCのUpdateModelを使い、一度に両方のテーブルを更新しようとすると失敗する。
いろいろ調べたけど、解決策が見つからず、UpdateModelを使わずにちまちまフィールドごとに代入すると
問題無く動く。(結局のところ、商品価格テーブルの主キーが重複するとかそういう感じ)

で、そもそもテーブルの構造がいまいちじゃないかと思い、商品価格テーブルの方の主キーを商品IDと販社IDの
複合キーにしてみた。

そうすると、UpdateModelで問題無く更新できる。

コントローラ

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(Test01.Models.Product model)
        {
            var db = new Test01.Models.MyContext();

            var product = db.Products.Find(model.ProductID);
            UpdateModel(product);

            db.SaveChanges();

            return RedirectToAction("Index", new { id = model.ProductID });
        }

モデル

    public class Price
    {
        [Key]
        [Column(Order = 0)]
        public int ProductID { get; set; }
        [Key]
        [Column(Order = 1)]
        public int SupplierID { get; set; }
        public decimal ProductPrice { get; set; }
  
        public virtual Product Product { get; set; }
    }

    public class Product
    {
        [Key]
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public virtual IList<Price> Prices { get; set; }
    }

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください