gpt4 book ai didi

entity-framework - ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象

转载 作者:行者123 更新时间:2023-12-03 05:43:29 27 4
gpt4 key购买 nike

基本上,我有一个表,其中包含一家公司的一些属性。这是“主”表,它们的 ID 用于许多其他表。我基本上是通过这个方法找到他们的ID:

private Company currentcompany()
{
Company cuco = db.Companies.Single(x => x.username == User.Identity.Name);
return cuco;
}

我需要让用户能够更新存储在该表中的有关他们自己的各种详细信息,我做得很好 - 但是,我注意到一个很大的安全漏洞!

在 Firefox 上使用 Tamper Data(我想象 Fidler/许多其他产品),我可以轻松更改隐藏 ID 并修改其他公司的详细信息。

为了阻止这种情况,我将以下几行添加到修改操作中:

        Company cuco = currentcompany();

if (company.id != cuco.id)
{
return Content("Security Error");
}

(仅供引用 - Company 是代表公司的模型/POCO,而 company 本身就是表单数据。)

添加此内容后,如果我编辑表单数据中的 ID,它会按预期工作并显示“安全错误”,但是,如果没有错误并且继续,我会在问题中收到错误.

“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”

我相信这是因为 EF 以某种方式检测并保留第一个数据拉取,但我只是不确定如何纠正它。

有什么建议吗?

编辑---更新--

如果您能理解我想要实现的目标,是否有更好的方法来解决这个问题?

最佳答案

如果从上下文加载实体,则无法再次附加具有相同键的实体。第一个实体仍然保存在内部上下文缓存中,并且上下文只能保存每个类型具有给定键值的一个实例(在其他情况下称为身份映射,I described it here)。

您可以通过分离以前的实例来解决此问题,但您不必这样做。如果您只需要保存新值,您可以使用:

  • ObjectContext API:context.YourEntitySet.ApplyCurrentValues(newEntity);
  • DbContext API:context.Entry(oldEntity).CurrentValues.SetValues(newEntity);

关于entity-framework - ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6033638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com