0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 4
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
EF Добавление данных в таблицу DataGrid со внешним ключом через другую форму23.04.2021, 19:42. Показов 2295. Ответов 7
Метки entity framework, sql management studio, wpf c#, База данных, внешнийидентификатор, курсовая работа (Все метки)
Всем привет. Пишу курсовую работу и столкнулась с крайне сложной задачей (для меня) — осуществить добавление данных в таблицу, содержащую сразу два внешних ключа. При попытке добавить всплывает следующее исключение:
SqlException: Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK_Заказы_Заказчики". Конфликт произошел в базе данных "Марк-Трейдинг", таблица "dbo.Заказчики", column 'ИдЗак'. Выполнение данной инструкции было прервано. Суть этого исключения мне понятна: не осуществляется заполнение поля таблицы в БД "ИдЗак" (айди заказчика из др. таблицы). Пыталась избежать этого при помощи такой строчки кода, однако исключение повторилось:
Xaml код основной формы:
0
|
23.04.2021, 19:42 | |
Ответы с готовыми решениями:
7
Добавление данных в таблицу через форму Добавление данных в таблицу через форму Добавление данных в таблицу sql через форму Добавление данных через форму в таблицу базы данных MS SQL |
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
23.04.2021, 20:59 | 2 |
Опять кириллица, Вас что, в одной бурсе всех учат ?
По сути: У Вас баг на баге, по сути везде. Например, по кнопке "Добавить" осн.формы Вы зачем-то создаете новый экземпляр модели "Заказ". Пустой. Затем открываете форму для заполнения полей, из которых предполагаете перенести данные в эту модель. Само по себе идиотизм, извините. При этом передать указатель на созданную только что модель не удосужились. В какую модель будет заносить данные Ваша вторая форма ? IF сам разберется в Ваших путанных мыслях ? Поехали дальше. Вторая форма по кнопке "Добавить" Ищутся id выбранных в комбобоксах CBNaim и CBOth (что они содержат, можно только догадываться) и кладутся в переменные. При этом никакой проверки на Null (если не найдено) не делается. А, да ладно, для курсача сойдет . Допустим, выбрали. не null. И ? Что дальше ? Сразу даем SaveChanges ВСЕМУ контексту !!! Надо полагать, что Вы рассуждали примерно так: 1. Я добавила в контекст новый экземпляр сущности "Заказ". EF это запомнил. 2. Я нашла id внешних ключей для того, чтобы записать их в новую сущность 3. Я даю команду "сохранить изменения". При этом EF должен взять созданный ранее экземпляр модели, проинициализировать самостоятельно все ее поля, затем догадаться, что в переменных IdZakaz и IdOth лежат нужные ссылки на справочники (а как иначе, ведь он сам же давал их по запросам к кому же контексту), вероятно потому, что они имеют такие же имена, как и поля-свойства модели, и все это аккуратно сохранить в базу. Конгениально !, как сказал бы Остап Добавлено через 6 минут Покажите все классы модели
0
|
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 4
|
||||||||||||||||
23.04.2021, 21:20 [ТС] | 3 | |||||||||||||||
Прошу прощения за то, что мой код написан настолько неумело — чему научили, то и пытаюсь реализовать :(
Правда, буду премного благодарна, если разъясните, как в моем случае можно выйти из ситуации и осуществить то, что требуется, каким-либо способом. Как-то улучшать код и делать его идеальным надобности нет (ведь, как я поняла, в таком варианте исхода событий нужно переделывать абсолютно всё :D) Модель заказов:
0
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
23.04.2021, 22:45 | 4 |
Надо:
1. Модель (содержимое папки Models), состоящее в общем случае из 2-х частей: 1. EF (папка .edmx), содержит два блока кода - классы моделей (декларация) и контекст (набор DBSet<T>) - имплементация 2. Расширение. - Классы расширения. Содержат декларации классов - проекций наборов данных, полученных в результате выполнения запросов, не имеющих соответствующих сущностей в БД и, естественно, отсутствующих в папке .edmx. Нужны для выборок данных из нескольких таблиц или выборок с агрегатами. - Репозиторий - статичный класс, реализующий весь функционал взаимодействия с БД. Содержит методы выборок, изменений в БД, в том числе с использование контекста EF. Его методы получают исходные данные как список параметров или ссылку на модель, возвращают набор данных (например для гридов) или Модель или списки для комбобоксов и т.д. 2. Главная форма. Содержит визуальные элементы для отображения информации БД, полученной и обновляемой из Репозитория. Содержит элементы управления, связанные с управлением гридом (поиски, сортировки, фильтрации). Работают опять же с Репозиторием, передавая нужные параметры /(колонка и порядок сортировки, шаблон и имя колонки для поиска/фильтрации и т.д.) Содержит элементы управления для модификации данных (открытие модальных форм редактирования) 3. Вторичные формы. Открываются модально для редактирования или правки текущей записи грида. Получают от главной формы id активной записи грида или -1, ели новая запись. Предоставляют элементы для внесения данных - TextBox, Datetimepicker, UpDown, Combobox т.д. По событию Load три первых при редактировании заполняются данными из записи, найденной в EF по полученнному id методом FirstOrDefault контекста EF. При вставке чистятся. Последние заполняются из справочников (ссылочных таблиц) с помощью методов репозитория, возвращающих вместо моделей только id и наименования, которые содержатся в видимой части развернутого комбобокса. Две кнопки "Сохранить" и "Отменить". Добавлено через 1 минуту Заметьте, пока мы не трогали контекст EF. Тем самым не вносили никаких правок в его кеш (а это ВАЖНО). Добавлено через 2 минуты В гриде главной формы лежат модели, не связанные с EF ибо получили их не через его контекст и модели, а через наше расширение. Т.е. EF ни разу не напрягся, а это хорошо Добавлено через 14 минут Вторичная форма. По нажатию "Отмена" просто закрытие формы и возврат в грид. Ничего и нигде трогать не нужно. EF курит в стороне - и это хорошо. Нажата "Сохранить". Вот тут работаем, засучив рукава. Прежде всего клиентская валидация - проверка обязательности и корректности введенных юзером данных. При первой же ошибке - сообщение и выделение контрола с ошибкой цветом фона. (Нужно не забыть написать общий обработчик на все элементы, который будет сбрасывать "красный" фон при любом его изменении, например KeyDown). Валидация прошла успешно - данные готовы для отправки на сервер. Код формы обращается к соответствующему методу Репозитория, передавая ему введенные значения либо списком параметров либо через модель, предварительно создав ее и перенеся в нее данные из контролов. Метод репозитория, получив данные, уже в контексте EF создает новую модель, заполняет ее полученными данными. При этом, если был указан ключ или значение на вторичную таблицу-справочник, метод делает запрос к контексту EF, получая от него нужную модель EF (запись ссылочной таблицы) и результат помещает все в ту же модель (там, где ICollection). Итак, модель готова и заполнена, можно посмотреть ее содержимое в отладчике. Вот теперь можно и нужно дать SaveChanges контексту EF. Сейчас он точно поймет что от него требуется и выполнит запись в БД. После этого вторичная форма сигнализирует (кодом возврата) Главной форме, что добавления или изменение прошло успешно. Главная форма перечитывает датасет и, если нужно находит и делает текущей измененную или только что добавленную запись грида. Добавлено через 2 минуты Предваряю вопрос о том, как узнать id только что добавленной записи. После SaveChanges можно извлечь новый Id из самой модели, куда его вложит EF. Вот этот Id и можно передать главной форме в качестве кода возврата. Добавлено через 4 минуты В результате Вы получаете приложение, в котором формы ничего не знают про БД, никаким образом не передают данные между собою (кроме разве что id) и никак не лазают друг дружке в контролы. Также Вы имеете Модель, полностью реализующую всю логику работы с БД и никоим образом не зависящую от каких бы то ни было форм и контролов. Это значит, что Вы можете кромсать Ваш интерфейс как угодно, тасуя формы и контролы на них как колоду карт - работа с базой останется в стороне - ее не нужно будет править вообще.
0
|
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 4
|
|
23.04.2021, 22:58 [ТС] | 5 |
Огромное спасибо за то, что Вы так подробно все расписали. Пойду все разбирать и вникать, но, в случае чего, ожидайте кучу вопросов, скорее всего, и очень глупых в том числе.
0
|
MsGuns
|
24.04.2021, 12:19
#6
|
Не по теме: Umeco, Валяйте, помочь милой барышне - честь для благородного рыцаря :)
0
|
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 4
|
|
24.04.2021, 14:27 [ТС] | 7 |
MsGuns,
Хотелось бы побольше узнать касательно этой части, остальное, вроде как, понятно. Было бы хорошо привести конкретный пример кода, так как с теорией у меня более-менее, а вот как расписать всё на практике — довольно проблематично. Было бы круто также, если бы Вы обозначили какой-то конкретный материал, где это можно изучать поподробнее, ибо в нашем колледже не рассказывают ничего от слова совсем; всё должны познавать сами, в связи с чем и образуются подобные некрасивые кодики.
0
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
24.04.2021, 17:32 | 8 |
Для начала:
https://metanit.com/sharp/articles/mvc/11.php
0
|
24.04.2021, 17:32 | |
24.04.2021, 17:32 | |
Помогаю со студенческими работами здесь
8
Перенос данных из трех таблиц DataGrid в другую таблицу DataGrid Добавление данных в таблицу через форму - не могу найти ошибку Добавление записи с внешним ключом в БД Добавление и редактирование данных через кнопочную форму в таблицу, не имеющую своих ключей Добавление в таблицы объединенные внешним ключом Добавить запись в таблицу с внешним ключом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |