powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Удаление записи в БД через DataGrid
5 сообщений из 5, страница 1 из 1
Удаление записи в БД через DataGrid
    #36932314
TL123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть DataGrid в WPF-проекте, которая заполняется данными из БД. При клике правой клавиши мыши на записи(строке) появляется контекстное меню и выбирается команда "Удалить".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
private void Delete_MenuItem_Click(object sender, RoutedEventArgs e)
        {
            if (SelectedObject != null)
            {
                ApplicationController.DataContext.DeleteObject(SelectedObject);
                ApplicationController.DataContext.SaveChanges();
            }
        }

public object SelectedObject
        {
            get
            {
                if ( dataGridPatient.SelectedItem == null)
                    return null;

                return dataGridPatient.SelectedItem;
            }
        }
При выполнении команды SaveChanges() возникает ошибка "An unhandled exception of type 'System.Data.UpdateException' occurred in System.Data.Entity.dll

Additional information: В набор AssociationSet "FK_Examinations_Patients" добавляется связь или связь удаляется из этого набора. При наличии ограничений на количество элементов необходимо также добавить или удалить соответствующий "Examination"."
Вот изображение модели:


Как я понимаю, это происходит из-за ассоциативных связей между таблицами.
Ради эксперимента удалял аналогичным способом записи из таблицы без всяких связей. Все работает отлично.
Каким образом можно удалить запись из БД из связанных таблиц? Ничего толкового не нашел ни в инете, ни в книгах. Везде все обо всем и ни о чем.
...
Рейтинг: 0 / 0
Удаление записи в БД через DataGrid
    #36934780
TL123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ап, никто не сталкивался с таким?
...
Рейтинг: 0 / 0
Удаление записи в БД через DataGrid
    #36936983
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TL123,
Осмелюсь предположить, что у тебя в таблице Examination есть внешний ключ Patient, а при удалении записи из таблицы Patients происходит нарушение целостности БД. Попробуй сначала удалять записи, относящиеся к Patient из таблицы Examination, а потом уже удалять запись из таблицы Patient.
...
Рейтинг: 0 / 0
Удаление записи в БД через DataGrid
    #36937290
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
simply_sash,

"Осмелюсь предположить, что" на форум стыдно выходить с подобными (тривиальными) вопросами :)


TL123,

либо включить каскадное удаление (если это позволяет "System.Data.Entity.dll"), либо как сказал simply_sash (если что-то непонятно - сначала rtfm - затем на форум)
...
Рейтинг: 0 / 0
Удаление записи в БД через DataGrid
    #36938423
TL123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подсказки.
Сделал следующим образом(может кому пригодится):
Открыл БД в Microsoft SQL Server Management Studio. Зашел в Таблицы . Выбирал нужную мне таблицу, заходил в Ключи , дважды кликал на ключах, начинающихся с FK_. В появившемся окне раскрывал Спецификация INSERT и UPDATE и выставлял в Правило удаление параметр Каскадно . Затем сохранил все изменения в базе и закрыл Microsoft SQL Server Management Studio.
Далее, в студии открыл свою edm-модель. Клик правой кнопкой мыши на любом месте модели(кроме граф. отображения таблиц и связей), выбрал Update Model From DataBase (next->next->finish).
Сохраним обновленную модель. Далее открываем модель через Open With... -> Xml Editor.
Видим, что в секции <!-- SSDL content --> в Association добавилось правило OnDelete с ключом каскадного удаления:
Код: plaintext
1.
2.
3.
4.
5.
6.
<Association Name="FK_Curve_VesselMaps">
          <End Role="VesselMaps" Type="dataModel.Store.VesselMaps" Multiplicity="0..1">
            <OnDelete Action="Cascade" />
          </End>
          <End Role="Curve" Type="dataModel.Store.Curve" Multiplicity="*" />
          ...
        </Association>
А теперь надо добавить
Код: plaintext
<OnDelete Action="Cascade" />
в точно такие же ассоциации для секции <!-- CSDL content --> ручками. При вставке будьте внимательными, что
Код: plaintext
<OnDelete Action="Cascade" />
должен располагаться между тегами <End> и </End>.
Сохраните, билд и вот оно счастье:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
private void Delete_MenuItem_Click(object sender, RoutedEventArgs e)
        {
            if (SelectedObject != null)
            {
                ApplicationController.DataContext.DeleteObject(SelectedObject);
                ApplicationController.DataContext.SaveChanges();
            }
        }
код работает как надо.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Удаление записи в БД через DataGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]