Entity Error 4.1 ObjectStateManager - объект с таким же ключом уже существует в objectstatemanager - PullRequest
0 голосов
/ 12 июля 2011

Я просто загружаю страницу, используя метод find (), который возвращает одну запись для отображения в виде сводки, а моя viewmodel также возвращает список того, что я называю метриками, чтобы клиент мог визуально идентифицировать метрики, которые он использовал для проекта.Если они не использовали эти метрики, они могут обновить значение до нуля.Как только они обновляют метрики, они нажимают сохранить, чтобы вставить эти метрики в таблицу.Итак, мы находим, что у меня изначально были метрики, извлеченные из таблицы метрик со статусом «Запланировано» для плановых метрик.Когда они загружают эти метрики на страницу, эти метрики будут обновляться, если необходимо, новыми значениями, а затем повторно вставляться в виде новых строк со статусом = «Фактический».

Исходная плановая запись метрики - metricid = 1, metricstatus = 'Запланированная' Новая фактическая запись метрик - нет идентификатора перед вставкой, metricstatus = 'Фактическая'

При вставке возникает следующая ошибка.

Объект с таким же ключом уже существует в 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 ]

1 голос
/ 07 марта 2012

Пожалуйста, проверьте ниже упомянуть вещи, когда сталкиваются с этой ошибкой:

  1. При вставке таблицы базы данных, имеющей первичный ключ типа данных uniqueidentitifer, затем также установите значение столбца первичного ключа в коде. Например. RequestId = Guid.NewGuid(); Даже если первичный ключ заполняется в хранимой процедуре вставки с использованием sql function newid().
  2. При обновлении строки в таблице базы данных не устанавливайте значение столбца первичного ключа в коде позади. Вместо этого обновите строку по отношению к значению столбца первичного ключа.
0 голосов
/ 12 июля 2011

Порядок, когда вы добавляете новый metric к project.Metrics и когда вы присоединяете project к контексту, неверен.

В Metrics имеется много метрик с ID = 0коллекция вашего project.Когда вы теперь присоединяете этот график к контексту, EF переводит проект и все дочерние коллекции в состояние Unchanged.Исключение жалуется на то, что существует более одного экземпляра с идентификатором = 0.

Чтобы решить проблему, вы должны вызвать эту строку ...

this.Context.Projects.Attach(project)

... перед вы запускаете цикл foreach и добавляете новые метрики в коллекцию Metrics вложенного project.Обнаружение изменений EF автоматически распознает их как новых детей и поместит их в состояние Added в контекст.В Added разрешено дублирование идентификаторов состояния (если ваш первичный ключ является столбцом идентификатора базы данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...