2012-02-20 10 views
0

をこれは私のViewModelされるリンクではありません私の問題は、私はhttppostの有効なviewmodelを取得することです、私はプレーヤーにユーザーを追加します(それはカスタムクラスであり、プレーヤークラスでは仮想ユーザーです)。すべてが大丈夫です(プレーヤーには正しいユーザーが含まれています)が、次回は他のビューでユーザーを取得しようとします。ユーザーのプロパティはnullです。私はそれをデータベースでチェックし、UserIDを持つ列にはintがありません。だから多分誰かが私の問題をどこに助けることができる?なぜそれは貯蓄していないのですか?ViewModelには、仮想クラス

編集:

private bool disposed = false; 

     protected virtual void Dispose(bool disposing) 
     { 
      if (!this.disposed) 
      { 
       if (disposing) 
       { 
        db.Dispose(); 
       } 
      } 
      this.disposed = true; 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 

及びこれにコントローラの変化: 私は私のリポジトリにこのコードを追加

[Authorize,HttpPost] 
     public ActionResult Upravit(int id, PlayerViewModel playerView) 
     { 
      if (ModelState.IsValid) 
      { 
       using (PlayerRepository playerRepository = new PlayerRepository()) 
       { 
        playerView.Player.User = playerRepository.GetUserByID(playerView.SelectedUserID); 

        playerRepository.Save(playerView.Player); 
        return RedirectToAction("Podrobnosti", new { id = playerView.Player.PlayerID }); 
       } 
      } 
      return View(playerView); 
     } 

を、それは助けをdidn't。

EDIT2 私のプレーヤーとユーザークラス:

public class User 
{ 
    public User() 
    { 
    } 
    public User(int userId, string userName, string firstName, string surname, string password, string email) 
    { 
     UserID = userId; 
     UserName = userName; 
     Name = firstName; 
     Surname = surname; 
     Password = password; 
     Email = email; 
     IsActivated = false; 
    } 

    [HiddenInput(DisplayValue = false)] 
    public int UserID { get; set; } 

    [Display(Name="Uživatelské jméno")] 
    [Required(ErrorMessage = "Je potřeba vyplnit uživatelské jméno.")] 
    [StringLength(20)] 
    public string UserName { get; set; } 

    public string Name { get; set; } 

    public string Surname { get; set; } 
    [Display(Name = "Heslo")] 
    [DataType(DataType.Password)] 
    [Required(ErrorMessage = "Je potřeba vyplnit heslo.")] 
    [StringLength(30)] 
    public string Password { get; set; } 

    [Display(Name = "E-mail")] 
    [DataType(DataType.EmailAddress)] 
    [Required(ErrorMessage = "Je potřeba vyplnit Váš e-mail.")] 
    [StringLength(30)] 
    public string Email { get; set; } 
    public IIdentity Identity { get; set; } 

    public string ImagePath { get; set; } 

    public virtual ICollection<Article> Articles { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 
    public virtual ICollection<Post> Posts { get; set; } 
    public virtual ICollection<Topic> Topics { get; set; } 

    public int RoleId { get; set; } 
    public virtual Role Role { get; set; } 

    public bool IsActivated { get; set; } 
    public string EmailKey { get; set; } 
} 
} 

public class Player 
{ 
    [Key] 
    public int PlayerID { get; set; } 

    [Required] 
    public string Name { get; set; } 
    [Required] 
    public string Surname { get; set; } 

    public string PhotoUrl { get; set; } 

    public string Post { get; set; } 

    public virtual Team Team { get; set; } 

    public virtual User User { get; set; } 
} 

私は、コントローラ内のすべてのメソッドにレポを使用して追加し、コントローラ上のDisposeメソッドを追加し、今私はデータを示すとの問題を抱えています。たとえば、Player.User.UserNameを表示しようとしたとき(私はプレイヤーにいくつかのユーザーを手動で追加しました)、インスタンスObjectDataContextが破棄されて使用できないと言います。

+0

Entity Frameworkを使用しているようです。'Player'と' User'クラスのソースコードを提供してください。 –

+0

UserクラスとPlayerクラスを追加しました。 –

+0

私はサンプルコンソールアプリケーションを作成しました。これはうまくいきます: 'Player'を保存した後、正しい' User'プロパティをコンテキストから取得しました。 PlayerRepository.Retrieve()メソッドの実装を見せてください。 –

答えて

0

ObjectContextを処分する必要があるようです。それ以外の場合は毎回異なるObjectContextインスタンスが存在するため、コンテキストのオブジェクト間でクエリを実行するときに問題に遭遇する可能性があります。

RepositoryクラスのIDisposableを実装します。基底のObjectContextクラスインスタンスのDisposeメソッドを呼び出します。

クライアントコード:ここにリポジトリのDisposeを呼び出す:

がちょうどController由来クラスのDisposeメソッドをオーバーライドし、リポジトリの処分を簡素化するために

using (PlayerRepository playerRepository = new PlayerRepository()) 
{ 
    // Perform queries, etc. 
} 

を更新。 ASP.NET MVCフレームワークは、要求の最後にController.Dispose()を自動的に呼び出します。

更新

関係を定義するために<entity>Idというプロパティを定義する必要があります。

public class Player 
{ 
    // Having a property called <entity>Id defines a relationship. 
    public int UserId { get; set; } 
    public virtual User User { get; set; } 
} 

これが役立ちます。

+0

コントローラにIDisposableとChangeコードを実装しました。私はコントローラーで正しいコードを持っていますか?なぜなら、それはまだ助けなかったからです。 –

+0

コントローラの1つのメソッドにコンテキストを配置しているようです: 'Upravit(int id、PlayerViewModel playerView)'。しかし、他の方法はどうですか?ちなみに、アップデートをご覧ください。 –

+0

あなたが書いたことをやってみましたが、それは助けにはなりませんでした。もう一度手伝ってもらえますか?私には1つの質問があります。これは本当に必要な処理ですか?私はこの記事を見つけました:http://stephenwalther.com/blog/archive/2008/08/20/asp-net-mvc-tip-34-dispose-of-your-datacontext-or-don-t.aspxそれが必要ではないと言っている。 (私はNinjectを使用しています) –

関連する問題