2009-06-05 4 views
0

モデル参照プロパティを正しく設定するにはどうすればよいですか?モデルが別のモデルから継承するレコードを作成する

私はServiceというモデルにナビゲーションプロパティを持つPlatformというモデルを持っています。

私が抱えている問題は、platformToCreate.Serviceの値を設定することです。ここ

プラットフォームテーブルのスクリーンショットである:ここ

alt text http://img268.imageshack.us/img268/6394/platform.jpg

は、EDMのスクリーンショットである:

alt text http://img19.imageshack.us/img19/3664/edms.jpg

コード:

[ValidateInput(true)] 
     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Create([Bind(Exclude = "id")] Platform platformToCreate) 
     { 

      ViewData["title"] = platformToCreate.title; 
      ViewData["url"] = platformToCreate.url; 
      ViewData["platform_nm"] = platformToCreate.platform_nm; 
      ViewData["enabled"] = platformToCreate.enabled; 

      int selectedService = int.Parse(Request.Form["service_id"].ToString()); 

      var cats = from c in db.Services select c; 
      ViewData["service_id"] = new SelectList(cats, "id", "name", selectedService); 

      if (!_service.CreatePlatform(platformToCreate)) 
       return View(platformToCreate); 

      TempData["Msg"] = "Record Created"; 
      return RedirectToRoute(new { controller = "Home" }); 
     } 
+0

こんにちはニック、あなたがしようとしていることについてもっと詳しく教えていただけますか?あなたの目標は私には分かりません。ありがとう。 –

+0

Jeremy - テーブルPlatformsにレコードを追加する必要があります。通常は、選択したservice_idでレコードを挿入するprocを実行します。このフレームワークを使用すると、レコードを追加できますが、service_idはクラスメンバーの一部ではありません。サービスはです。だから私はどのように新しいレコードに関連するサービスを指定するのですか? – IEnumerator

答えて

1

それが依存しますあなたのEFのバージョン私がどのバージョンを知っていたとしても、可能性はまだ無限です。 :)私はあなたにいくつかの例を挙げます。

版バージョン2とPOCO 1.0

public void Update(User user) 
{ 

    using (var context = new ObjectContext("")) 
    { 
     user.Blog = GetBlog(user.Id); 

     context.ApplyPropertyChanges("User", user); 
    } 
} 

private Blog GetBlog(int userId) 
{ 
    using (var context = new ObjectContext("")) 
    { 
     return (from u in context.Users 
       where u.Id == userId 
       select u).FirstOrDefault(); 
    } 
} 

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual Blog Blog { get; set; } 

    public void AddEntry(Entry entry) 
    { 
     if (Blog.Entries == null) 
      Blog.Entries = new List<Entry>(); 

     entry.Blog = Blog; 
     Blog.Entries.Add(entry); 
    } 
} 

public class Blog 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<Entry> Entries { get; set; } 
} 

その後のコースのEntityKey値、ローディング参照等を使用して多数のオプションがあり、私は最も簡単に使用する傾向がありますしかし、変種。

編集:あなたの質問をしました。あなたがそれを正しく扱えば、MVCはとても寛容です。私は次のように起動します:あなたはあなたの選択リストを作成すると罰金のthats:

ViewData["service_id"] = new SelectList(cats, "id", "name", selectedService); 

しかし、あなたは実際には次のようにそれを割り当てることができますMVCで正しくこの選択リストを使用する:

<%= Html.DropDownList("Service.Id", (IEnumerable<SelectListItem>)ViewData["service_id"])%> 

事ここで注意するのはService.Idです。これは、ドロップダウンリストで選択された値がPlatform.Service.Idに割り当てられたことを意味します。変更を永続化すると、Entity Frameworkが機能します。

+0

私はあなたのコードのバージョン1を試しましたが、エラーをスローしています:ObjectStateManagerには、 'Admin.Models.Platform'タイプのオブジェクトへの参照を含むObjectStateEntryが含まれていません。 – IEnumerator

+0

私の元の答えの一番下を見て、少し更新しました。 – mhenrixon

+0

恐ろしい!ありがとうございました。 – IEnumerator

関連する問題