C# ViewModel未链接虚拟类
这是我的ViewModel:C# ViewModel未链接虚拟类,c#,asp.net-mvc,asp.net-mvc-3,mvvm,ef-code-first,C#,Asp.net Mvc,Asp.net Mvc 3,Mvvm,Ef Code First,这是我的ViewModel: public class PlayerViewModel { PlayerRepository repo = new PlayerRepository(); public Player Player { get; set; } public int SelectedUserID { get; set; } public SelectList Users { get; set; }
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;
}
}
这是在我的控制器中,用于编辑:
[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);
}
和回购:
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;
}
我的问题是,我在httppost中获得了有效的viewmodel,我将用户添加到播放器,它是自定义类,在播放器类中它是虚拟用户,在调试中它看起来一切正常,播放器包含正确的用户,但下一次当我在其他视图中尝试检索播放器时,它的属性和用户为空。我在数据库中检查了它,但在带有UserID的列中并没有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);
}
但这没用
编辑2
我的播放器和用户类:
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; }
}
我将using with repo添加到控制器中的每个方法,并在控制器上添加了Dispose方法,现在我在显示数据方面遇到了问题。例如,当我尝试显示Player.User.UserName时,我已经手动向Player添加了一些用户,它表示实例ObjectDataContext是dispose,无法使用 似乎有必要处理ObjectContext;否则,每次都会有不同的ObjectContext实例,在上下文的对象之间执行查询时可能会遇到问题 为存储库类实现IDisposable:调用底层ObjectContext类实例的Dispose方法 客户端代码:
using (PlayerRepository playerRepository = new PlayerRepository())
{
// Perform queries, etc.
}
更新
为了简化存储库的处置,只需覆盖控制器派生类的Dispose方法:在此处调用存储库的Dispose。ASP.NET MVC框架将在请求结束时自动调用Controller.Dispose
更新
必须定义名为Id的属性来定义关系
public class Player
{
// Having a property called <entity>Id defines a relationship.
public int UserId { get; set; }
public virtual User User { get; set; }
}
希望这有帮助。我在控制器中实现了IDisposable和change代码。控制器中的代码是否正确?因为它还没有起到作用。看起来您只在控制器的一个方法中处理上下文:Upravitint id,playervewmodel playerView。但是其他方法呢?顺便说一句,请看更新。我试着按照你写的做,但没用。你能再帮我一次吗?我有一个问题。这真的需要吗?我发现了这篇文章:有人说它是不需要的。我用的是NinjectHm,好的。关于这个问题,请看我的评论。真的有必要吗?有了这个属性,我在数据库的表中有了1列UserId,其中包含了1列User\u UserId。我这样问是因为我在重新创建时遇到了自动种子设定数据库的问题,但我修复了它。ObjectDataContext的问题仍然存在。似乎您正在使用实体框架。你能提供播放器和用户类的源代码吗?我添加了用户和播放器类。我创建了一个示例控制台应用程序,它对我来说运行良好:保存播放器后,从上下文中获得正确的用户属性。你能展示一下PlayerRepository.Retrieve方法的实现吗?谢谢你的帮助,但我删除了这个方法,并用UserId尝试了一下,我不知道这是真的还是其他一些改变,但现在它正在工作:非常感谢你。欢迎你!很高兴听到它对你有用=