如何删除MVC/Entity Framework中的对象:无法删除该对象,因为在ObjectStateManager中找不到该对象

Pra*_*bhu 3 .net c# asp.net-mvc entity-framework linq-to-sql

尝试删除用户和关联对象时收到错误消息.错误消息是无法删除对象,因为在ObjectStateManager中找不到该对象.

CONTROLLER

[Authorize, HttpPost]
    public ActionResult DeleteUser(string UserName)
    {
        User user = _userRepository.GetByUserName(UserName);

        if (user == null)
            return new FileNotFoundResult();

        _repository.DeleteUser(user);

        return RedirectToAction("Index");
    }
Run Code Online (Sandbox Code Playgroud)

REPOSITORY

public void DeleteUser(User user)
            {            
                foreach (Follower follower in user.Followers)
                    _db.Followers.DeleteObject(follower);

                foreach (Comment comment in user.Comments.ToList())
                    _db.Comments.DeleteObject(comment);   

                _db.Users.DeleteObject(user);
            }
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

tay*_*onr 5

你的代码是_userRepository.GetByUserName(UserName)什么样的?

听起来对我来说,你是从一个上下文中获取用户,并试图从另一个上下文中删除.

例如

User myUser = null;

using(MyData data = new MyData())
{
    myUser = data.GetUserById(1);
}
Run Code Online (Sandbox Code Playgroud)

using(MyData data = new MyData())
{
    data.DeleteUser(myUser);
}
Run Code Online (Sandbox Code Playgroud)

第二个"数据"不知道该用户,因为它没有检索它.

相反,你必须要有类似的东西

using(MyData data = new MyData())
{
    data.Context.Entry(myUser).State = EntityState.Deleted;
    data.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

语法可能不完全正确,但实际上您需要设置您的用户对象是该数据上下文中的实体,并且它的状态是Deleted.

您需要做类似的事情我想修改现有对象(将状态设置为EntityState.Modified)