Подтвердить что ты не робот

С# Невозможно определить главный конец отношения

foreach (var item in order.MyFiles)
{
   var newFile = adapter.db.File.CreateObject();

   newFile.Name = item.FileName;

   adapter.db.File.AddObject(newFile);

   adapter.db.SaveChanges();

   item.MyFile.Add(new MyFile { FileID = newFile.FileID });

   adapter.db.SaveChanges();
}

foreach (var item in tempFilesList)
{
    adapter.db.DeleteObject(item);
}

adapter.db.SaveChanges();

Этот код дублирует строки в таблице MyFile, например, если цикл повторяется 3 раза, я вижу 6 строк (3 x 2 * adapter.db.SaveChanges()???)

Но, если у меня только один adapter.db.SaveChanges(); (последний), я получаю ошибку

Невозможно определить основной конец отношения 'my_dbModel.FK_MyFile_File'. Несколько добавленных объектов могут иметь один и тот же первичный ключ.

Я предполагаю, что это вызвано тем, что в этом случае он не фиксирует элементы adapter.db.File.AddObject(newFile);, прежде чем указывать их на item.MyFile.Add(new MyFile { FileID = newFile.FileID }); Но я могу ошибаться, любые идеи, как его исправить?

4b9b3361

Ответ 1

Вы не можете использовать newFile.FileID при определении нового MyFile перед сохранением изменений. Вы должны использовать свойство навигации File в своем классе MyFile. EF будет определять отношение и будет передавать данные соответствующим образом.

Попробуйте изменить строку item.MyFile.Add(new MyFile { FileID = newFile.FileID }); на:

item.MyFile.Add(new MyFile { File = newFile });  

где File - свойство навигации, определенное в объекте MyFile.

Ответ 2

Это может быть из-за циклической ссылки в EDMX обратно в ту же таблицу.

Например, если EmployeeDepartment - это таблица, которую вы собираетесь обновить, а основной ключ - EmployeeDepartmentID, а если это столбец идентификатора и автоматически сгенерированный, проверьте EDMX, ссылается ли на EmployeeDepartmentID на себя. Если это так, щелкните правой кнопкой мыши по этой ссылке переднего ключа и нажмите "Удалить".

Это сработало для меня, и я надеюсь, что это сработает и для вас.

Спасибо,

Бибин.