AcceptChanges не может продолжаться, потому что значения ключа объекта конфликтуют с другим объектом в ObjectStateManager - PullRequest
5 голосов
/ 22 сентября 2011

Изменения в базе данных были успешно зафиксированы, но при обновлении контекста объекта произошла ошибка.ObjectContext может быть в несовместимом состоянии.Внутреннее сообщение об исключении: AcceptChanges не может продолжаться, потому что значения ключа объекта конфликтуют с другим объектом в ObjectStateManager.Убедитесь, что значения ключей уникальны перед вызовом AcceptChanges.

Это сообщение об ошибке, которое я получаю.вот две функции, которые я использую ...

    public IList<string> GenerateVersions(decimal id, decimal fId, string folderName, string filename, string objFile)
    {
        List<string> generatedFiles = new List<string>();

        foreach (var tCmdSets in db.IMG_SETTINGS_CMDSETS.Where("it.SETTINGS_FOLDER_ID = @folderid", new ObjectParameter("folderid", id)))
        {
            var strDestinationPath = ImageResizer.Util.PathUtils.RemoveExtension(Path.Combine(tmpDefaultFolder, tCmdSets.SETTINGS_CMDSET_DESTINATION, filename));
            ResizeSettings objResizeCommand = new ResizeSettings(tCmdSets.SETTINGS_CMDSET_COMMAND);

            var strCreatedFile = ImageBuilder.Current.Build(objFile, strDestinationPath, objResizeCommand, false, true);
            generatedFiles.Add("### File created: (" + folderName + " » " + tCmdSets.SETTINGS_CMDSET_NAME + " ») " + Path.GetFileName(strCreatedFile));

            IMG_UPLOAD_GENERATED_FILES tObjGenerated = new IMG_UPLOAD_GENERATED_FILES();

            tObjGenerated.UPLOAD_GENERATED_FILE_NAME = Path.GetFileName(strCreatedFile);
            tObjGenerated.UPLOAD_GENERATED_PATH = Path.GetDirectoryName(strCreatedFile);
            tObjGenerated.SETTINGS_CMDSET_ID = tCmdSets.SETTINGS_CMDSET_ID;
            tObjGenerated.UPLOAD_FILE_ID = fId;

            dbHandler.IMG_UPLOAD_GENERATED_FILES.AddObject(tObjGenerated);
            dbHandler.SaveChanges();
        }
        return generatedFiles;
    }

    public ActionResult UploadBulkFiles(decimal id)
    {
        IMG_SETTINGS_FOLDERS img_settings_folders = db.IMG_SETTINGS_FOLDERS.Single(i => i.SETTINGS_FOLDER_ID == id);
        string strBulkDirectory = Path.Combine(tmpDefaultFolder, img_settings_folders.SETTINGS_FOLDER_BULK);
        string[] objFiles = Directory.GetFiles(strBulkDirectory);
        List<string> lstOuput = new List<string>();

        foreach (var tFile in objFiles)
        {
            System.IO.File.Move(tFile, Path.Combine(tmpDefaultFolder, "masters", img_settings_folders.SETTINGS_FOLDER_NAME, Path.GetFileName(tFile)));

            lstOuput.Add("### File moved to masters (" + img_settings_folders.SETTINGS_FOLDER_NAME + " ») " + Path.GetFileName(tFile));

            IMG_UPLOAD_FILES tObjUploadedFile = new IMG_UPLOAD_FILES();

            tObjUploadedFile.UPLOAD_FILE_NAME = Path.GetFileName(tFile);
            tObjUploadedFile.SETTINGS_FOLDER_ID = img_settings_folders.SETTINGS_FOLDER_ID;

            dbHandler.IMG_UPLOAD_FILES.AddObject(tObjUploadedFile);
            dbHandler.SaveChanges();

            var objGeneratedFiles = GenerateVersions(img_settings_folders.SETTINGS_FOLDER_ID,tObjUploadedFile.UPLOAD_FILE_ID, img_settings_folders.SETTINGS_FOLDER_NAME, Path.GetFileName(tFile), Path.Combine(tmpDefaultFolder, "masters", img_settings_folders.SETTINGS_FOLDER_NAME, Path.GetFileName(tFile)));
            lstOuput.AddRange(objGeneratedFiles);
        }
        if (lstOuput.Count > 0)
        {
            return PartialView("UploadSingleFile", lstOuput);
        }
        else
        {
            return PartialView("NoUploads");
        }
    }

МОДЕЛЬ ДАННЫХ

IMG_UPLOAD_FILE

  • UPLOAD_FILE_ID (PK)
  • UPLOAD_FILE_NAME
  • SETTINGS_FOLDER_ID

IMG_UPLOAD_GENERATED_FILES

  • UPLOAD_GENERATED_FILE_ID (PK)
  • UPLOAD_GENERATED_FILE_23_ * * * 10 * * 10 * * 10 * * 10 * * 10 * * 101027 *
  • UPLOAD_FILE_ID

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Самое близкое, что я могу найти, чтобы найти ответ:

Поскольку Oracle использует триггер Sequence + для создания значений "Auto Ident", похоже, что когда структура сущностей добавляет объект при сохранении, возвращаемое значение по-прежнему равно 0, потому что триггер / последовательность еще не обновили его .

Из-за числа 0 ObjectMannager будет думать, что несколько объектов с ключом сущности 0 находятся в конфликте.

У меня нет «пуленепробиваемых» решений, но я переписал свои решения, чтобы справиться с этим другим способом.

\ T

2 голосов
/ 22 декабря 2013

У меня был точно такой же сценарий с Entity Model, основанной на базе данных Oracle.Реализация Identity выполняется с помощью триггера, поэтому при добавлении таблиц в модель он не устанавливает для свойства StoreGenertedPattern столбца идентификаторов значение Identity, поскольку он не знает, что этот столбец является идентификатором.необходимо открыть редактор модели, найти объект в модели, щелкнуть ключевой столбец и вручную установить для свойства StoreGenertedPattern значение «Identity».

0 голосов
/ 26 июля 2013

Возможно, это не связано с вашей проблемой, но я получал эту проблему на веб-странице с запущенным менеджером ajax, пока я не сделал это:

    ...
    private static _objectContext;
    protected void Page_Init(object sender, EventArgs e)
    {
        _objectContext = new ObjectContext();
    }
    ...
    protected void _ContextCreating(object sender, EntityDataSourceContextCreatingEventArgs e)
    {
        e.Context = _objectContext;
    }

    protected void _ContextDisposing(object sender, EntityDataSourceContextDisposingEventArgs e)
    {
        e.Cancel = true;
    }

Создание ObjectContext в Page_Load, когда нет обратной передачи, вызвало для меня это исключение.

...