Для работы с таблицами базы данных разработано ряд функций, которые делятся на те, которые:
- добавляют записи (create). Возвращает id новой записи;
- читают таблицы (details). Возвращает результат запроса;
- изменяют запись в таблице (edit). Возвращает id изменной записи;
- удаляет запись из таблицы (delete). Возвращает id удаленной записи.
Функция createв контролере студента– добавляет новую запись в таблицу Person. Входящий параметр – фамилия,имя, дата рождения,телефон и emailстудента. Возвращает id новой записи или ошибку, если добавление не получилось.
// GET: Students/Create
public IActionResult Create()
{
ViewData["GroupNameID"] = new SelectList(_context.GroupNames, "GroupNameID", "Namegroup");
return View();
}
// POST: Students/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> Create(
[Bind("PhoneNumber,BornDate,FirstMidName,LastName, Email, GroupNameID")] Student student)
{
try
{
if (ModelState.IsValid)
{
_context.Add(student);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
}
catch (DbUpdateException /* ex */)
{
//Log the error (uncomment ex variable name and write a log.
ModelState.AddModelError("", "Unable to save changes. " +
"Try again, and if the problem persists " +
"see your system administrator.");
}
ViewData["GroupNameID"] = new SelectList(_context.GroupNames, "GroupNameID", "Namegroup", student.GroupNameID);
return View(student);
}
Функция createв контролере группы– добавляет новую запись в таблицу GroupName. Входящие параметры – названиегруппы, названиегруппы. Возвращает название группы.
// GET: GroupNames/Create
public IActionResult Create()
{
return View();
}
// POST: GroupNames/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> Create([Bind("GroupNameID,Namegroup")] GroupName groupName)
{
if (ModelState.IsValid)
{
_context.Add(groupName);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(groupName);
}
Функция createв контролере кафедры – добавляет новую запись в таблицу Kafedra. Входящий параметр – idкафедры, название, ученная степень преподователя, ФИО преподователя. Возвращает имя новой записи или ошиьку, если добавление не получилось.
// GET: kafedras/Create
public IActionResult Create()
{
ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName");
return View();
}
// POST: kafedras/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> Create([Bind("KafedraID, Name, SuperSadist, PrepodID,RowVersion")] Kafedra kafedra)
{
if (ModelState.IsValid)
{
_context.Add(kafedra);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName", kafedra.PrepodID);
return View(kafedra);
}
Функция createв контролере преподавателя– добавляет новую запись в таблицу Person. Входящий параметр – ФИО, дата рождения, кафедра преподавателя. Возвращает имя новой записи или ошибку, если добавление не получилось.
{
var prepod = new Prepod
{
Predmet_Assignments = new List<Predmet_Assignment>()
};
PopulateAssignedPredmetData(prepod);
return View();
}
// POST: Prepods/Create
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> Create([Bind("FirstMidName,BornDate,LastName,Office_Assignment")] Prepod prepod, string[] selectedPredmets)
{
if (selectedPredmets!= null)
{
prepod.Predmet_Assignments = new List<Predmet_Assignment>();
foreach (var predmet in selectedPredmets)
{
var predmetToAdd = new Predmet_Assignment { PrepodID = prepod.ID, PredmetID = int.Parse(predmet) };
prepod.Predmet_Assignments.Add(predmetToAdd);
}
}
if (ModelState.IsValid)
{
_context.Add(prepod);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
PopulateAssignedPredmetData(prepod);
return View(prepod);
}
Функция createв контролере предмета– добавляет новую запись в таблицу Predmet. Входящие параметры – idпредмета, кредит, названиекафедры и название предмета. Возвращает название новой записи или ошибку, если добавление не получилось.
// GET: predmets/Create
public IActionResult Create()
{
PopulateKafedrasDropDownList();
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> Create([Bind("PredmetID,Credits,KafedraID,Title")] Predmet predmet)
{
if (ModelState.IsValid)
{
_context.Add(predmet);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
PopulateKafedrasDropDownList(predmet.KafedraID);
return View(predmet);
}
Функция createв контролере оценки – добавляет новую запись в таблицу ball. Входящие параметры – название предмета, названиепреподавателя, который поставилоценку и имя студента, которому поставили оценку. Возвращает название новой записи или ошибку, если добавление не получилось.
// GET: Enrollments/Create
public IActionResult Create()
{
ViewData["PredmetID"] = new SelectList(_context.Predmets, "PredmetID", "Title");
ViewData["StudentID"] = new SelectList(_context.Students, "ID", "FullName", "GroupName");
ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName");
return View();
}
// POST: Enrollments/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> Create([Bind("EnrollmentID,PredmetID,StudentID, PrepodID,Ball")] Enrollment enrollment)
{
if (ModelState.IsValid)
{
_context.Add(enrollment);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ViewData["PredmetID"] = new SelectList(_context.Predmets, "PredmetID", "Title", enrollment.PredmetID);
ViewData["StudentID"] = new SelectList(_context.Students, "ID", "FullName", enrollment.StudentID);
ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName", enrollment.PrepodID);
var conn = _context.Database.GetDbConnection();
await conn.OpenAsync();
using (var command = conn.CreateCommand())
{
string query = "SELECT AVG(Ball) " +
"From ball where StudentID = " + enrollment.StudentID;
command.CommandText = query;
DbDataReader reader = awaitcommand.ExecuteReaderAsync();
if (reader.HasRows)
{
while (await reader.ReadAsync())
{
ViewData["AvgBall"] = reader.GetDecimal(0);
}
}
}
return View(enrollment);
}
Функция deleteв контролере оценки – удаляет запись из таблицы. Входящие параметры – название таблицы, из которой нужно удалить запись, id записи, которую необходимо удалить. Возвращает id удаленной записи или ошибку, если удаление не получилось.
// GET: Enrollments/Delete/5
publicasync Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var enrollment = await _context.Enrollments
.Include(e => e.Predmet)
.Include(e => e.Student)
.Include(e => e.Prepod)
.SingleOrDefaultAsync(m => m.EnrollmentID == id);
if (enrollment == null)
{
return NotFound();
}
return View(enrollment);
}
// POST: Enrollments/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> DeleteConfirmed(int id)
{
var enrollment = await _context.Enrollments.SingleOrDefaultAsync(m => m.EnrollmentID == id);
_context.Enrollments.Remove(enrollment);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
privatebool EnrollmentExists(int id)
{
return _context.Enrollments.Any(e => e.EnrollmentID == id);
}
Функцияindexв контролере оценки – возвращаеттаблицуball. Входящиепараметры – нету.
// GET: Enrollments
publicasync Task<IActionResult> Index()
{
var schoolContext = _context.Enrollments
.Include(e => e.Predmet)
.Include(e => e.Student)
.Include(e => e.Prepod);
return View(await schoolContext.ToListAsync());
}
Функция indexв контролерегруппы– возвращает таблицу групп, в которыхучатся студенты. Входящиепараметры – нету.
// GET: GroupNames
publicasync Task<IActionResult> Index(string sortOrder,
string currentFilter,
string searchString,
int? page,
int? id)
{
//Сортировка
ViewData["CurrentSort"] = sortOrder;
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder)? "id_desc":"";
ViewData["GroupSortParm"] = sortOrder == "Namegroup"? "Namegroup_desc":"Namegroup";
if (searchString!= null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewData["CurrentFilter"] = searchString;
var groupnames = from s in _context.GroupNames
select s;
if (!String.IsNullOrEmpty(searchString))
{
groupnames = groupnames.Where(s => s.Namegroup.Contains(searchString));
}
switch (sortOrder)
{
case"Namegroup":
groupnames = groupnames.OrderBy(s => s.Namegroup);
break;
case"Namegroup_desc":
groupnames = groupnames.OrderByDescending(s => s.Namegroup);
break;
default:
groupnames = groupnames.OrderBy(s => s.Namegroup);
break;
}
int pageSize = 30;
return View(await PaginatedList<GroupName>.CreateAsync(groupnames.AsNoTracking(), page?? 1, pageSize));
}
Функция indexв контролерекафедры– возвращает таблицу Kafedra. Входящиепараметры – нету.
// GET: kafedras
publicasync Task<IActionResult> Index()
{
var schoolContext = _context.Kafedras.Include(d => d.Administrator);
return View(await schoolContext.ToListAsync());
}
Функция indexв контролерепредмета – возвращает таблицу Predmet. Входящиепараметры – нету.
// GET: Predmets
publicasync Task<IActionResult> Index()
{
var predmets= _context.Predmets
.Include(c => c.Kafedra)
.AsNoTracking();
return View(await predmets.ToListAsync());
}
Функция indexв контролерепредмета– возвращает таблицу предметов, которые преподают конкретныепреподаватели. Входящийпараметр – нету
// GET: Prepods
publicasync Task<IActionResult> Index(int? id, int? predmetID)
{
var viewModel = new PrepodIndexData
{
Prepods = await _context.Prepods
.Include(i => i.Office_Assignment)
.Include(i => i.Predmet_Assignments)
.ThenInclude(i => i.Predmet)
.ThenInclude(i => i.Kafedra)
.OrderBy(i => i.LastName)
.ToListAsync()
};
if (id!= null)
{
ViewData["PrepodID"] = id.Value;
Prepod prepod = viewModel.Prepods.Where(
i => i.ID == id.Value).Single();
viewModel.Predmets = prepod.Predmet_Assignments.Select(s => s.Predmet);
}
if (predmetID!= null)
{
ViewData["PredmetID"] = predmetID.Value;
var selectedPredmet = viewModel.Predmets.Where(x => x.PredmetID == predmetID).Single();
await _context.Entry(selectedPredmet).Collection(x => x.Enrollments).LoadAsync();
foreach (Enrollment enrollment in selectedPredmet.Enrollments)
{
await _context.Entry(enrollment).Reference(x => x.Student).LoadAsync();
}
viewModel.Enrollments = selectedPredmet.Enrollments;
}
return View(viewModel);
}
Функция indexв контролерестудентов– возвращает таблицу студентов, которые учатся в университете. Входящийпараметр – нету.
// GET: Students
publicasync Task<IActionResult> Index(
string sortOrder,
string currentFilter,
string searchString,
int? page,
int? id,
string Namegroup)
{
//Сортировка
ViewData["CurrentSort"] = sortOrder;
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder)? "name_desc":"";
ViewData["GroupSortParm"] = sortOrder == "Namegroup"? "group_desc":"Namegroup";
if (searchString!= null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewData["CurrentFilter"] = searchString;
var students = from s in _context.Students
select s;
if (!String.IsNullOrEmpty(searchString))
{
students = students.Where(s => s.LastName.Contains(searchString)
|| s.FirstMidName.Contains(searchString));
}
switch (sortOrder)
{
case"name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case"Namegroup":
students = students.OrderBy(s => s.GroupName.Namegroup);
break;
case"group_desc":
students = students.OrderByDescending(s => s.GroupName.Namegroup);
break;
default:
students = students.OrderBy(s => s.LastName);
break;
}
int pageSize = 30;
return View(await PaginatedList<Student>.CreateAsync(students
.Include (s => s.GroupName)
.AsNoTracking(), page?? 1, pageSize));
}
// GET: Students/Details/5
publicasync Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var student = await _context.Students
.Include (s => s.GroupName)
.Include(s => s.Enrollments)
.ThenInclude(e => e.Predmet)
.AsNoTracking()
.SingleOrDefaultAsync(m => m.ID == id);
if (student == null)
{
return NotFound();
}
return View(student);
}
Функция editв контролере студента – изменяет все, записи о студенте. Входящие параметры – id студента, новое название того что хотим изменить. Возвращаетidживотногоилиошибку, еслизаменанеудалась.
// GET: Students/Edit/5
publicasync Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var student = await _context.Students
.AsNoTracking()
.SingleOrDefaultAsync(m => m.ID == id);
if (student == null)
{
return NotFound();
}
ViewData["GroupNameID"] = new SelectList(_context.GroupNames,"GroupNameID", "Namegroup", student.GroupNameID);
return View(student);
}
// POST: Students/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> EditPost(int? id)
{
if (id == null)
{
return NotFound();
}
var studentToUpdate = await _context.Students
.SingleOrDefaultAsync(s => s.ID == id);
if (await TryUpdateModelAsync<Student>(
studentToUpdate, "",
s => s.FirstMidName, s => s.LastName, s => s.BornDate, s => s.PhoneNumber, s => s.Email, s => s.GroupNameID))
{
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException /* ex */)
{
//Log the error (uncomment ex variable name and write a log.)
ModelState.AddModelError("", "Не удалось сохранить изменения. " +
"Повторите попытку, и если проблема не исчезнет." +
"обратитесь к системному администратору.");
}
returnRedirectToAction(nameof(Index));
}
ViewData["GroupNameID"] = new SelectList(_context.GroupNames, "GroupNameID", "Namegroup", studentToUpdate.GroupNameID);
return View(studentToUpdate);
}
Функция editв контролере преподавателя– изменяет все записи о преподавателе. Входящие параметры – id записи. Возвращает id измененной записи.
// GET: Prepods/Edit/5
publicasync Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var prepod = await _context.Prepods
.Include(i => i.Office_Assignment)
.Include(i => i.Predmet_Assignments).ThenInclude(i => i.Predmet)
.AsNoTracking()
.SingleOrDefaultAsync(m => m.ID == id);
if (prepod == null)
{
return NotFound();
}
PopulateAssignedPredmetData(prepod);
return View(prepod);
}
privatevoid PopulateAssignedPredmetData(Prepod prepod)
{
var allPredmets = _context.Predmets;
var prepodPredmet = new HashSet<int>(prepod.Predmet_Assignments.Select(c => c.PredmetID));
var viewModel = new List<AssignedPredmetData>();
foreach (var predmet in allPredmets)
{
viewModel.Add(new AssignedPredmetData
{
PredmetID = predmet.PredmetID,
Title = predmet.Title,
Assigned = prepodPredmet.Contains(predmet.PredmetID)
});
}
ViewData["Predmets"] = viewModel;
}
Функцияeditв контролере кафедры– изменяетназваниекафедры. Входящие параметры – id кафедры, новое название кафедры. Возвращаетidкафедрыилиошибку, еслизаменанеудалась.
// GET: kafedras/Edit/5
publicasync Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var kafedra = await _context.Kafedras
.Include(i => i.Administrator)
.AsNoTracking()
.SingleOrDefaultAsync(m => m.KafedraID == id);
if (kafedra == null)
{
return NotFound();
}
ViewData["kafedraID"] = new SelectList(_context.Prepods, "ID", "FullName", kafedra.PrepodID);
return View(kafedra);
}
Функцияeditв контролере группы– изменяет код иназваниегруппы. Входящие параметры – id группы, новое название группы. Возвращаетidгруппыилиошибку, еслизаменанеудалась.
// GET: GroupNames/Edit/5
publicasync Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var groupName = await _context.GroupNames.SingleOrDefaultAsync(m => m.GroupNameID == id);
if (groupName == null)
{
return NotFound();
}
return View(groupName);
}
// POST: GroupNames/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> Edit(int id, [Bind("GroupNameID,Namegroup")] GroupName groupName)
{
if (id!= groupName.GroupNameID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(groupName);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!GroupNameExists(groupName.GroupNameID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(groupName);
}
Функция editв контролере оценки– изменяет оценку, кто и кому поставили. Входящие параметры – id предмета, id студента. Возвращаетidоценкиилиошибку, еслизаменанеудалась.
// GET: Enrollments/Edit/5
publicasync Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var enrollment = await _context.Enrollments
.Include (e => e.PredmetID)
.Include (e => e.StudentID)
.Include (e => e.PrepodID)
.SingleOrDefaultAsync(m => m.EnrollmentID == id);
if (enrollment == null)
{
return NotFound();
}
ViewData["PredmetID"] = new SelectList(_context.Predmets, "PredmetID", "Title", enrollment.PredmetID);
ViewData["StudentID"] = new SelectList(_context.Students, "ID", "FullName", enrollment.StudentID);
ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName", enrollment.PrepodID);
return View(enrollment);
}
// POST: Enrollments/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> Edit(int id, [Bind("EnrollmentID,PredmetID,StudentID,PrepodID,Ball")] Enrollment enrollment)
{
if (id!= enrollment.EnrollmentID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(enrollment);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!EnrollmentExists(enrollment.EnrollmentID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
ViewData["PredmetID"] = new SelectList(_context.Predmets, "PredmetID", "Title", enrollment.PredmetID);
ViewData["StudentID"] = new SelectList(_context.Students, "ID", "FullName", enrollment.StudentID);
ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName", enrollment.PrepodID);
return View(enrollment);
}
Функцияeditв контролере предмета– изменяетназваниепредмета, кредаты. Входящие параметры – id предмета. Возвращаетidпредметаили ошибку, еслизаменанеудалась.
[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
publicasync Task<IActionResult> EditPost(int? id)
{
if (id == null)
{
return NotFound();
}
var predmetToUpdate = await _context.Predmets
.SingleOrDefaultAsync(c => c.PredmetID == id);
if (await TryUpdateModelAsync<Predmet>(predmetToUpdate,
"",
c => c.Credits, c => c.KafedraID, c => c.Title))
{
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException /* ex */)
{
//Log the error (uncomment ex variable name and write a log.)
ModelState.AddModelError("", "Не удалось сохранить изменения. " +
"Повторите попытку, и если проблема не исчезнет." +
"обратитесь к системному администратору.");
}
returnRedirectToAction(nameof(Index));
}
PopulateKafedrasDropDownList(predmetToUpdate.KafedraID);
return View(predmetToUpdate);
}
privatevoid PopulateKafedrasDropDownList(object selectedKafedra = null)
{
var kafedraQuery = from d in _context.Kafedras
orderby d.Name
select d;
ViewBag.KafedraID = newSelectList(kafedraQuery.AsNoTracking(), "KafedraID", "Name", selectedKafedra);
}
Функция список студентов по среднему баллу. Входящие параметры – балл, ФИО студента. Возвращает таблицу с средним баллом, с указанием фамилии, имени студента, среднего балла. Таблица сортируется по среднему баллу в порядке возрастания.
publicasyncTask<ActionResult>Srball()
{
List<SrBall> srballs = new List<SrBall>();
var conn = _context.Database.GetDbConnection();
try
{
await conn.OpenAsync();
using (var command = conn.CreateCommand())
{
string query = "SELECT AVG(Ball), LastName, FirstName " +
"From ball, person " +
"Where StudentID = ID " +
"Group by StudentID " +
"Order by avg(Ball)asc";
command.CommandText = query;
DbDataReader reader = awaitcommand.ExecuteReaderAsync();
if (reader.HasRows)
{
while (await reader.ReadAsync())
{
var row = new SrBall { Ball = reader.GetDecimal(0), LastName = reader.GetString(1), FirstMidName = reader.GetString(2) };
srballs.Add(row);
}
}
reader.Dispose();
}
}
finally
{
conn.Close();
}
return View(srballs);
}






