Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Удаление записи в БД через DataGrid / 5 сообщений из 5, страница 1 из 1
01.11.2010, 21:15
    #36932314
TL123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление записи в БД через DataGrid
Есть 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
02.11.2010, 18:47
    #36934780
TL123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление записи в БД через DataGrid
Ап, никто не сталкивался с таким?
...
Рейтинг: 0 / 0
03.11.2010, 18:13
    #36936983
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление записи в БД через DataGrid
TL123,
Осмелюсь предположить, что у тебя в таблице Examination есть внешний ключ Patient, а при удалении записи из таблицы Patients происходит нарушение целостности БД. Попробуй сначала удалять записи, относящиеся к Patient из таблицы Examination, а потом уже удалять запись из таблицы Patient.
...
Рейтинг: 0 / 0
03.11.2010, 22:05
    #36937290
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление записи в БД через DataGrid
simply_sash,

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


TL123,

либо включить каскадное удаление (если это позволяет "System.Data.Entity.dll"), либо как сказал simply_sash (если что-то непонятно - сначала rtfm - затем на форум)
...
Рейтинг: 0 / 0
04.11.2010, 19:54
    #36938423
TL123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление записи в БД через DataGrid
Спасибо за подсказки.
Сделал следующим образом(может кому пригодится):
Открыл БД в 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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Удаление записи в БД через DataGrid / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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