Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Удаление записи в БД через DataGrid  [new]
TL123
Member

Откуда:
Сообщений: 15
Есть DataGrid в WPF-проекте, которая заполняется данными из БД. При клике правой клавиши мыши на записи(строке) появляется контекстное меню и выбирается команда "Удалить".
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"."
Вот изображение модели:
Картинка с другого сайта.

Как я понимаю, это происходит из-за ассоциативных связей между таблицами.
Ради эксперимента удалял аналогичным способом записи из таблицы без всяких связей. Все работает отлично.
Каким образом можно удалить запись из БД из связанных таблиц? Ничего толкового не нашел ни в инете, ни в книгах. Везде все обо всем и ни о чем.
1 ноя 10, 21:15    [9714808]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи в БД через DataGrid  [new]
TL123
Member

Откуда:
Сообщений: 15
Ап, никто не сталкивался с таким?
2 ноя 10, 18:47    [9721134]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи в БД через DataGrid  [new]
simply_sash
Member

Откуда: Брест, Беларусь
Сообщений: 40
TL123,
Осмелюсь предположить, что у тебя в таблице Examination есть внешний ключ Patient, а при удалении записи из таблицы Patients происходит нарушение целостности БД. Попробуй сначала удалять записи, относящиеся к Patient из таблицы Examination, а потом уже удалять запись из таблицы Patient.
3 ноя 10, 18:13    [9727102]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи в БД через DataGrid  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
simply_sash,

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


TL123,

либо включить каскадное удаление (если это позволяет "System.Data.Entity.dll"), либо как сказал simply_sash (если что-то непонятно - сначала rtfm - затем на форум)
3 ноя 10, 22:05    [9728081]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи в БД через DataGrid  [new]
TL123
Member

Откуда:
Сообщений: 15
Спасибо за подсказки.
Сделал следующим образом(может кому пригодится):
Открыл БД в 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 с ключом каскадного удаления:
<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>
А теперь надо добавить
<OnDelete Action="Cascade" />
в точно такие же ассоциации для секции <!-- CSDL content --> ручками. При вставке будьте внимательными, что
<OnDelete Action="Cascade" />
должен располагаться между тегами <End> и </End>.
Сохраните, билд и вот оно счастье:
private void Delete_MenuItem_Click(object sender, RoutedEventArgs e)
        {
            if (SelectedObject != null)
            {
                ApplicationController.DataContext.DeleteObject(SelectedObject);
                ApplicationController.DataContext.SaveChanges();
            }
        }
код работает как надо.
4 ноя 10, 19:54    [9731001]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить