«Обнаружен цикл в наборе изменений» с Linq to SQL

В настоящее время я разрабатываю приложение, в котором возникает исключение «В наборе изменений был обнаружен цикл» при вызове DataContext.SubmitChanges(). Я знаю, почему возникает это исключение, но я не смог найти решение для своей ситуации. Позвольте мне объяснить ситуацию. У меня есть база данных с таблицей, как показано ниже, к которой я обращаюсь с помощью LINQ to SQL, поэтому она сопоставляется с классами в vb.net.

Device
-------
ID
DefaultGatewayID

DefaultGatewayID — это Устройство, которое может быть тем же самым объектом или другим Устройством. Пользователь использует графический интерфейс с DataGrid для изменения и добавления новых записей. Обновление записей не проблема. Идентификатор уже существует, и DefaultGatewayObject прикреплен к записи (идентификатор хранится в базе данных).

Однако, когда я пытаюсь добавить новую запись и установить DefaultGatewayObject в той же транзакции, я получаю исключение «Цикл, обнаруженный в наборе изменений». Я подозреваю, что это вызвано LINQ to SQL, потому что он не знает, какую запись добавить первой, хотя в данном случае это один и тот же элемент.

У меня нет возможности разбить вставку на две части, одну для устройства, а затем добавить DefaultGateway, потому что моя кнопка отправки привязана к команде XAML, которая выполняет SubmitChanges.

В идеале у меня была бы возможность указать, какой объект должен быть создан первым, или что-то в этом роде. Я думаю, что это вариант удалить соединение с самим собой и просто установить идентификатор в этом поле, но я бы предпочел найти исправление в LINQ to SQL.

Я надеюсь, что у SO есть ответ на этот вопрос. Я мог найти только этот связанный пост a-circularly-lin">"Обнаружен цикл при добавлении циклически связанного списка"


person retanik    schedule 09.08.2013    source источник


Ответы (1)


Вы можете разбить вставку на две части и оставить одну транзакцию, если поместите свой код в TransactionScope.

Using trans As New TransactionScope()
    'Code that generates a new ID in the database
    dc.SubmitChanges()

    'Code that uses the new ID value.
    dc.SubmitChanges()

    trans.Complete()
End Using

Это единственный способ избежать исключения. Если это невозможно из-за архитектурных решений ("моя кнопка отправки привязана к команде XAML"), вам необходимо изменить архитектуру. Я думаю, что команда пользовательского интерфейса никогда не должна быть так близко к уровню доступа к данным. Вам лучше вызвать метод службы из XAML.

person Gert Arnold    schedule 09.08.2013
comment
Я подозревал, что мне придется изменить способ сохранения моих модификаций, так что это будет следующей целью. Спасибо за быстрый ответ. Однако у меня все еще есть проблема с разделением submitchanges, поскольку сетка данных привязана к коллекции, которая изменена. Любые советы по этой части? - person retanik; 09.08.2013
comment
Это действительно трудно сказать, не зная приложения. Ключ, вероятно, заключается в разделении пользовательского интерфейса и доступа к данным с помощью моделей представления. Может быть, вы можете выделить небольшую часть и задать другой вопрос по этому конкретному вопросу. - person Gert Arnold; 09.08.2013