2012-02-20 2 views
0

를이 내 뷰 모델입니다 연결되지 내 문제는 내가 httppost 유효한 viewmodel에 도착, 플레이어 (그것은 사용자 정의 클래스 및 선수 클래스에서 그것은 가상 사용자 사용자)에 사용자를 추가하고 디버그에서 보면 (플레이어가 올바른 사용자를 포함하고 있지만) 다른 모든보기에서 플레이어를 검색하려고 할 때 다음에 사용자가있는 속성이 null입니다. 나는 그것을 데이터베이스에서 검사했고 사용자 ID가있는 열에 int가 없다. 어쩌면 누군가가 문제가있는 곳에서 나를 도울 수 있습니까? 왜 저축하지 않는거야?뷰 모델은 가상 클래스

편집 : 이것에

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); 
     } 

를하지만 도움이 않았나.

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; } 
} 

나는 컨트롤러의 모든 방법의 repo로 사용하여 추가 및 컨트롤러의 폐기 방법을 추가하고 지금은 데이터를 보여주는 문제가 있습니다. 예를 들어 Player.User.UserName을 보여 주려고 시도했을 때 (플레이어에 일부 사용자를 수동으로 추가 한 경우) 인스턴스 ObjectDataContext가 처리되었고 사용할 수 없다고합니다.

+0

Entity Framework를 사용하고있는 것 같습니다.'Player' 및'User' 클래스의 소스 코드를 제공해 주시겠습니까? –

+0

사용자 및 플레이어 클래스를 추가했습니다. –

+0

예제 콘솔 응용 프로그램을 만들었습니다. 그것은 잘 작동합니다 :'Player'를 저장 한 후에 컨텍스트에서 올바른'User' 속성으로 얻었습니다. PlayerRepository.Retrieve() 메소드의 구현을 보여 주시겠습니까? –

답변

0

ObjectContext을 처분해야합니다. 그렇지 않으면 매번 다른 ObjectContext 인스턴스가 있으므로 컨텍스트의 개체 사이에서 쿼리를 수행 할 때 문제가 발생할 수 있습니다.

리포지토리 클래스에 IDisposable을 구현합니다. ObjectContext 클래스 인스턴스의 Dispose 메서드를 호출합니다.

클라이언트 코드 : 여기 저장소에 대한 Dispose 전화 :

그냥 Controller 유도 된 클래스의 Dispose 메소드를 오버라이드 (override), 저장소 폐기를 단순화하기 위해

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 및 변경 코드를 구현했습니다. 컨트롤러에 올바른 코드가 있습니까? 왜냐하면 그것은 아직 도움이되지 않았기 때문입니다. –

+0

컨트롤러의 한 가지 방법, 즉'Upravit (int id, PlayerViewModel playerView)'에서만 컨텍스트를 삭제하는 것 같습니다. 그러나 다른 방법은 어떨까요? 그건 그렇고, 업데이 트를 참조하십시오. –

+0

나는 당신이 쓴 것을 시도했지만 도움이되지 못했습니다. 너 나 좀 도와 줄 수있어? 그리고 한 가지 질문이 있습니다. 이 처분이 정말로 필요한 것입니까? 이 기사가 발견되었습니다. http://stephenwalther.com/blog/archive/2008/08/20/asp-net-mvc-tip-34-dispose-of-your-datacontext-or-don-t.aspx 그것이 필요하지 않다고 말하는 것입니다. (나는 Ninject를 사용하고있다) –