Я пытаюсь создать систему управления студентами, используя веб-формы ASP.NET и базу данных. Я связал базу данных с моим проектом, используя Entity Framework.
Но после того, как я нажал кнопку «Отправить», я получаю ошибку внешнего ключа.
Вот мой код и диаграмма базы данных:
public void btnAddStudent_Click(object sender, EventArgs e)
{
var db = new STUDENT_MANAGEEntities();
var tb = new Student_Info();
tb.Student_Id = Convert.ToInt32(txtStudentId.Text.Trim());
tb.Name = txtName.Text.Trim();
tb.Semester_Id = Convert.ToInt32(dpdSemester.SelectedIndex);
tb.Session = txtSession.Text.Trim();
tb.Department_Id = Convert.ToInt32(dpdDepartment.SelectedIndex);
tb.Shift_Id = Convert.ToInt32(dpdShift.SelectedIndex);
tb.Gender_Id = Convert.ToInt32(dpdGender.SelectedIndex);
tb.Blood_Id = Convert.ToInt32(dpdBlood.SelectedIndex);
tb.Birth_Date = clrBirthDate.SelectedDate;
tb.Contact = txtContact.Text.Trim();
tb.Address = txtAddress.Text.Trim();
db.AddToStudent_Info(tb);
db.SaveChanges();
}
Диаграмма базы данных
И это ошибка, которую я получаю:
Можете ли вы привести пример, пожалуйста?
Это показывает, что я верю в то, что имею в виду stackoverflow.com/questions/32390577/…
Предполагая, что столбец tb.Blood_Id ссылается на dbo.Blood_Info через это ограничение внешнего ключа — проверьте, какое значение вы пытаетесь вставить для Blood_Id — существует ли это значение в таблице Blood_Info?? Кажется, вы просто пытаетесь вставить значение, которого нет в ссылочной таблице.
Я пробовал это. Но этот код показывает в раскрывающемся списке только идентификатор. Но я хочу показать имя как «1-я смена» для значения идентификатора 1; «2-я смена» для значения идентификатора 2. Надеюсь, вы поймете. @нбк
Ссылочная таблица @marc_s имеет точное значение, которое я хочу вставить. Но хотя это не работает. Можем ли мы общаться через любые социальные сети?
Вам нужен только Bloodtyoeid для вставки в вашу студенческую таблицу, в качестве текста для elenet вы берете значение Text, я думаю, что у вас есть все, что вам нужно, и поэтому у вас никогда не будет идентификатора, который не подходит
Проблема, вероятно, связана с использованием dpdBlood.SelectedIndex для установки tb.Blood_Id. Выбранный индекс — это число, начинающееся с 0, которое указывает, какой элемент в раскрывающемся списке выбрал пользователь: 0 — первый, 1 — второй и так далее. Этот индекс может не иметь ничего общего с Blood_Id выбранного элемента, поэтому он может не существовать в таблице Blood_Info. Вы смотрели на другие свойства элемента управления списком, такие как SelectedItem и SelectedValue?
Проблема в том, что вы используете SelectedIndex и используете его для FK. SelectedIndex — это просто позиция в списке выбранных элементов, поэтому 0,1,2,3,4,... Значения в раскрывающемся списке, вероятно, имеют разные значения идентификатора, и вы даже можете отсортировать их по имени и т. д. , поэтому идентификаторы могут быть, например, 4,1,2,5,3. Выбор первого элемента в списке может быть идентификатором крови 4, но SelectedIndex будет 0, что не соответствует ни одной записи крови.
Когда вы заполняете свои поля со списком на основе таблиц поиска, вам необходимо связать как текст, так и значение каждого элемента. Значение является ключом для этой записи, т.е. Идентификатор Типа Крови. Тогда я считаю, что SelectedValue должен дать вам эту связанную сумму значения, иначе вам может понадобиться разыграть SelectedItem как SelectListItem и получить его Value:
// try this...
tb.Blood_Id = Convert.ToInt32(dpdBlood.SelectedValue);
// or this...
var selectedItem = (SelectListItem)dpdBlood.SelectedItem;
tb.Blood_Id = Convert.ToInt32(selectedItem.Value);
Это нужно сделать для всех выпадающих списков. В противном случае вы получите ситуации, когда выбранные вами значения не сохраняются в той же записи (где индекс <> идентификатор) или ошибки, когда индекс не соответствует какому-либо идентификатору.
Спасибо всем. Эта ошибка решается с помощью SelectedItem.Value вместо SelectedIndex. Еще раз всем сердечное спасибо.
Когда у вас есть ключ fpreign между двумя таблицами, как у вас, тогда идентификатор крови должен существовать до вставки учащегося, обычно вы выбираете тип крови из поля со списком, чтобы вы вводили только существующие значения, и ошибка не возникнет