实体错误4.1 ObjectStateManager-对象状态管理器中已存在具有相同密钥的对象

时间:2011-07-12 18:17:37

标签: entity-framework

我只是使用find()方法加载页面,该方法返回一条记录作为摘要显示,我的viewmodel还返回一个我称之为指标的列表,以便客户可以直观地识别他们用于项目的指标。如果他们没有使用这些指标,那么他们可以将值更新为零。更新指标后,他们会单击“保存”将这些指标插入表中。因此,我们发现我最初从度量表中提取了度量标准,其中status ='Planned'用于计划度量标准。当他们将这些指标加载到页面中时,如果需要,这些指标将使用新值进行更新,然后重新插入状态为“实际”的新行。

原始计划指标记录 - metricid = 1,metricstatus ='已计划' 新的实际metircs记录 - 插入前没有id,metricstatus ='Actual'

插入过程中出现以下错误。

ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。这是我插入记录的方式

IList<Metric> MetricList = new List<Metric>();

foreach (var projectMetric in ProjectMetrics){
    if (projectMetric.MetricTypeId != 0)
    {
        var metric = new Metric
        {
            Value = Int32.Parse(projectMetric.Value),
            MetricTypeId = projectMetric.MetricTypeId,
            ProjectId = project.ProjectId,
            MetricPhase = "Actual"

        };

        project.Metrics.Add(metric);

    }
}

这是我保存更改的方式

this.Context.Projects.Attach(project);
this.Context.Entry(project).State = System.Data.EntityState.Modified;

this.Context.SaveChanges();

非常感谢任何帮助。


public Project GetProjectByID(int? id)
        {
            Project ProjectQuery = Context.Projects.Find(id);

            return ProjectQuery;

        }

我实际上将json字符串发送回具有所有指标的服务器。我按如下方式反序列化我的json字符串:


List InsertableProjectMetrics = JsonConvert.DeserializeObject>(metricsJSON);

然后我调用InsertMetricMethod,它循环遍历Jason度量数据。



 public void InsertProjectMetrics(List ProjectMetrics, int projectid, ref Project project, string Status)
        {
            //Insert Record: Insert New Record
            try
            {
                this.Context.Projects.Attach(project);

                foreach (var projectMetric in ProjectMetrics)
                {
                    if (projectMetric.MetricTypeId != 0)
                    {
                        var metric = new Metric
                        {
                            Value = Int32.Parse(projectMetric.Value),
                            MetricTypeId = projectMetric.MetricTypeId,
                            ProjectId = project.ProjectId,
                            MetricPhase = "Actual"
                        };

                        project.Metrics.Add(metric);

                    }
                }

2 个答案:

答案 0 :(得分:1)

遇到此错误时,请查看以下提及内容:

  1. 当插入数据库表时,具有数据类型的主键,uniqueidentitifer,然后在代码后面设置主键列值。例如。 RequestId = Guid.NewGuid();尽管使用sql function newid()在插入存储过程中填充了主键,但
  2. 更新数据库表中的行时,请不要在后面的代码中设置主键列值。而是将行wrt更新为主键列值。

答案 1 :(得分:0)

metric添加新project.Metrics以及将project附加到上下文时的顺序错误。

Metrics的{​​{1}}集合中有许多ID = 0的指标。现在将此图附加到上下文时,EF会将项目和所有子集合置于project状态。该异常会抱怨ID = 0的实例不止一个。

要解决此问题,您必须调用此行...

Unchanged

... 之前启动foreach循环并将新指标添加到附加this.Context.Projects.Attach(project) 的{​​{1}}集合中。然后,EF更改检测会自动将它们识别为新的子项,并将它们置于上下文中Metrics状态。在project状态允许重复ID(只要您的主键是数据库标识列)。