- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 MVC5 应用程序中有以下 HttpPost
Delete() 方法。据我所知,与此 Controller 、 View 甚至模型相关的任何内容都没有改变。
// POST: Admin/UserManagement/Delete/5
[HttpPost, ActionName("DeleteConfirmed")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DeleteConfirmed(string id)
{
ApplicationUser applicationUser = db.Users.Find(id);
if (applicationUser == null)
{
ModelState.AddModelError("", "Failed to find User ID for deletion.");
}
else
{
IdentityResult result = await UserManager.DeleteAsync(applicationUser);
if (result.Succeeded)
{
await db.SaveChangesAsync();
return RedirectToAction("Index", "UserManagement");
}
else
{
ModelState.AddModelError("", "Failed to Delete User.");
var errors = string.Join(",", result.Errors);
ModelState.AddModelError("", errors);
}
}
return View(applicationUser);
}
用户管理器部分:
[CustomAuthorization(myRoles = "Admin")]
public class UserManagementController : Controller
{
protected ApplicationDbContext db { get; set; }
private ApplicationUserManager _userManager;
public UserManagementController()
{
this.db = new ApplicationDbContext();
}
public UserManagementController(ApplicationUserManager userManager)
{
UserManager = userManager;
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
当我的代码到达 IdentityResult result = await UserManager.DeleteAsync(applicationUser)
时,它立即跳转到我下面的 Dispose() 方法,而不是索引 View 加载,我得到:“/”应用程序中的服务器错误。
无法删除该对象,因为在 ObjectStateManager 中找不到它。
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
if (UserManager != null)
{
UserManager.Dispose();
UserManager = null;
}
}
base.Dispose(disposing);
}
有人能告诉我哪里错了吗?我以前从未见过这个错误。以前此 DeleteConfirmed() 代码完全按预期工作。
编辑:
Startup.cs:
using Microsoft.Owin;
using Owin;
[assembly: OwinStartupAttribute(typeof(PROJECT.Startup))]
namespace PROJECT
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
}
}
EDIT2:
CustomAuthorization.cs(助手):
public class CustomAuthorization : AuthorizeAttribute
{
public string myRoles { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
var userAuthInfo = HttpContext.Current.User;
if (userAuthInfo != null)
{
if (!userAuthInfo.Identity.IsAuthenticated)
{
string returnUrl = filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult("/Account/Login?returnUrl=returnUrl");
return;
}
string[] roles = myRoles.Split(',');
var userAuth = false;
foreach (string role in roles)
{
if (userAuthInfo.IsInRole(role))
{
userAuth = true;
break;
}
}
if (!userAuth)
{
var result = new RedirectResult("/Home?auth=0");
filterContext.Result = result;
}
}
}
}
EDIT3
/App_Start/中的 Startup.Auth.cs:
public partial class Startup
{
// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}
}
解决方案 正如 haim770 指出的那样,我在我的 DeleteConfirmed()
操作方法中错误地使用了 2 个 DbContext 引用。
将 ApplicationUser applicationUser = db.Users.Find(id)
更改为正确的 async
并且一切都按预期工作:ApplicationUser applicationUser = await UserManager.FindByIdAsync( id);
感谢所有花时间提供帮助的人!
最佳答案
问题是您实际上在这里使用了 2 个 DbContext
,它们无法跟踪彼此的实体。
您必须更改您的 Controller 代码,让 db
和 UserManager
共享相同的上下文实例引用:
public UserManagementController()
{
this.db = context.Get<ApplicationDbContext>();
}
关于c# - MVC5/EF6 : Object cannot be deleted because it was not found in the ObjectStateManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24271715/
使用带有通用存储库模式的 EF5 和 ninject 进行依赖注入(inject),并在尝试使用我的 edmx 使用存储过程将实体更新到数据库时遇到问题。 我在 DbContextRepository
我有以下代码来添加或更新实体对象。根据我添加或更新对象的响应,通过主键查找对象。 添加记录有效,但在更新期间给出此错误消息“ObjectStateManager 中已存在具有相同键的对象。Object
基本上,我有一个表,其中包含一家公司的一些属性。这是“主”表,它们的 ID 用于许多其他表。我基本上是通过这个方法找到他们的ID: private Company currentcompany()
我有这段代码,但是我得到了异常 An object with the same key already exists in the ObjectStateManager. The ObjectStat
我遇到了 ObjectStateManager 的问题。 我正在使用 System.Data.Entity 和 System.Data.Objects 但是它没有显示 ObjectStateManag
我知道已经有人问过很多像这样的问题,但我似乎无法理解哪里出了问题。这是我的代码: [HttpGet] public ViewResult Edit(int id) { User user =
当我尝试从 Entity Framework 4 在我的数据库上下文中调用它时,出现“无法解析符号 ObjectStateManager”错误。我找不到其他人有此问题。我试过使用 System.Dat
我正在尝试将 foo 类型的实体列表插入到表 TB_FOO 中。 Public Sub Insert(ByVal _lstFoo As List(Of TB_FOO)) Try
我正在使用 EISK(员工信息入门工具包)开发应用程序。我的实体图看起来像这样 我尝试通过此代码更新应用程序表。 int apId = Convert.ToInt32(Reque
这是我在 MyObjectContext 类构造函数中所做的: ObjectStateManager.ObjectStateManagerChanged += ObjectStateManagerOb
背景 我在更新 EF 中的实体时遇到了一些问题。我不断收到此错误: “ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
我需要从我的数据库上下文中返回一个新添加对象的列表。 我读到我必须为此目的使用 ObjectStateManager。问题是,我的数据库上下文没有 ObjectStateManager 属性。 尽管上
我有这段正常工作的代码: db.myTable.DeleteObject(myCurrent); 我得到了这个错误: The object cannot be deleted because it w
我收到此错误“无法删除该对象,因为在 ObjectStateManager 中找不到它。” 我的代码是: protected MyEntities sqlEntities; publi
这两者有什么区别,哪个更好?使用更改对象状态或 Entry().state db.ObjectStateManager.ChangeObjectState(employeeFromDB, Entity
我以为我理解 EF,尤其是在极其简单的 CRUD 方面,但我可能错了。 我有一个 ObjectContext/Repository 模式,在这个例子中是一个 VatCode 实体,它有一个增值税率的集
我正在使用 EF4.1 从我的数据库中删除一个对象: public virtual void Delete(T entity) { _entities.CreateObjectSet().Dele
当我添加多个连续数据时,SaveChanges() 方法发生错误。 异常对数据库的更改已成功提交,但更新对象上下文时出错。 ObjectContext 可能处于不一致状态。内部异常消息:AcceptC
试图在这里处理 Entity Framework ,但我遇到了一些减速带......我有一个 Get() 方法可以正常工作并且已经过测试,但是我的 Delete 方法不起作用: public s
我在屏幕截图中发现了问题: 这是程序开头的代码: public MainWindow() { InitializeComponent(); Blacko
我是一名优秀的程序员,十分优秀!