This is my ViewModel:
public class PlayerViewModel
{
PlayerRepository repo = new PlayerRepository();
public Player Player { get; set; }
public int SelectedUserID { get; set; }
public SelectList Users { get; set; }
public PlayerViewModel()
{
Player = new Player();
}
public PlayerViewModel(Player player)
{
Player = player;
SelectedUserID = 0;
}
}
This is in my controller (it´s for editing):
[Authorize]
public ActionResult Upravit(int id)
{
var player = repo.Retrieve(id);
var playerView = new PlayerViewModel(player);
playerView.Users = new SelectList(repo.GetUsers(), "UserID", "UserName");
return View(playerView);
}
[Authorize,HttpPost]
public ActionResult Upravit(int id, PlayerViewModel playerView)
{
if (ModelState.IsValid)
{
playerView.Player.User = repo.GetUserByID(playerView.SelectedUserID);
repo.Save(playerView.Player);
return RedirectToAction("Podrobnosti", new { id = playerView.Player.PlayerID });
}
return View(playerView);
}
and repo:
public User GetUserByID(int id)
{
return db.Users.Find(id);
}
public int Save(Player player)
{
db.Entry(player).State = player.PlayerID == 0 ?
EntityState.Added : EntityState.Modified;
db.SaveChanges();
return player.PlayerID;
}
My problem is that I get in httppost valid viewmodel, I add User to player (it´s custom class and in player class it´s virtual User User) and in debug it looks everything ok (player contains right user) but nexttime when I in other view try to retrieve player it´s property with User is null. I checked it in database and there is no int in column with UserID. So maybe somebody can help me where is problem? Why it´s not saving?
Edit:
I added this code to my repository:
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);
}
and change in controller to 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);
}
but it didn´t help.
Edit2
My player and User classes:
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; }
}
I added using with repo to every method in Controller and added Dispose method on controller and now I have problem with showing data. For example when I tried showing Player.User.UserName (I have manually added some users to players) It says that instance ObjectDataContext was dispose and cant be used.
It seems it is necessary to dispose the
ObjectContext; otherwise there are a differentObjectContextinstances each time, you can run into problems when doing queries among objects of the contexts.Implement IDisposable for your Repository class: call the Dispose method for underlying
ObjectContextclass instance.Client code:
Update
To simplify disposing of the repository, just override
Disposemethod ofController-derived class: callDisposefor the repository here. The ASP.NET MVC framework will automatically callController.Dispose()at the end of the request.Update
It is necessary to define property called
<entity>Idto define the relationship.Hope this helps.