【问题标题】:ViewModel not linking virtual classViewModel 未链接虚拟类
【发布时间】:2012-02-20 19:02:20
【问题描述】:

这是我的 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;
        }
   }

这是在我的控制器中(用于编辑):

    [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 有效的视图模型,我将用户添加到播放器(它是自定义类,在播放器类中它是虚拟用户用户)并且在调试中它看起来一切正常(播放器包含正确的用户)但是下次当我在其他视图中尝试检索播放器时,它的用户属性为空。我在数据库中检查了它,并且在带有 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; }
}

我在 Controller 中的每个方法中添加了 using with repo 并在控制器上添加了 Dispose 方法,现在我在显示数据时遇到了问题。例如,当我尝试显示 Player.User.UserName(我已手动将一些用户添加到播放器)时,它说实例 ObjectDataContext 已处置且无法使用。

【问题讨论】:

  • 看来您正在使用实体框架。能否提供PlayerUser类的源码?
  • 我添加了 User 和 Player 类。
  • 我创建了一个示例控制台应用程序,它对我很有效:保存 Player 后,从上下文中获取正确的 User 属性。你能展示一下PlayerRepository.Retrieve()方法的实现吗?
  • 感谢您的每一个帮助,但我删除了该处理并使用 UserId 尝试它,我不知道它是否只是那个或其他一些更改,但现在它正在工作:) 所以非常感谢.
  • 不客气!很高兴听到它对你有用! =)

标签: c# asp.net-mvc asp.net-mvc-3 mvvm ef-code-first


【解决方案1】:

看来有必要处置ObjectContext;否则每次都会有不同的ObjectContext 实例,在上下文对象之间进行查询时可能会遇到问题。

为您的 Repository 类实现 IDisposable:为基础 ObjectContext 类实例调用 Dispose 方法。

客户端代码:

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

更新

为了简化存储库的处理,只需覆盖Controller-派生类的Dispose 方法:在此处为存储库调用Dispose。 ASP.NET MVC 框架会在请求结束时自动调用Controller.Dispose()

更新

需要定义名为&lt;entity&gt;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 并更改了代码。我在控制器中有正确的代码吗?因为它还没有帮助。
  • 您似乎只在控制器的一种方法中处理上下文:Upravit(int id, PlayerViewModel playerView)。但是其他方法呢?顺便说一下,请看更新。
  • 我试着按照你写的做,但没有帮助。你能再帮帮我吗?我有一个问题。这种处置真的需要吗?我找到了这篇文章:stephenwalther.com/blog/archive/2008/08/20/…,据说不需要。 (我正在使用 Ninject)
  • 嗯,好的。请参阅我对问题的评论。
  • 真的有必要吗?有了这个,我在数据库 1 列 UserId 的表中没有该属性,我有 1 列 User_UserId。我之所以问,是因为我在重新创建时遇到了自动播种数据库的问题(但我修复了它)。 ObjectDataContext 的问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2017-04-15
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多