Programmeerimine

Eduka projekti kirjeldus

for (int i = 0; i < 5; i++) 
{
  Console.WriteLine(i);
}
for (int i = 0; i < 5; i++) 
{
  Console.WriteLine(i);
}

Projekt “TallinnaRakenduslikKolledz”

Selle projekti eesmärk on luua funktsioonaalne kooli veebileht ning õppida, kuidas ehitada veebilehti kasutades C# .net MVC arhitektuuri.

Veebilehe haldaja saab avada veebilehe ning vaadata: õpilaste, õpetajate, osakonnade, kursuste ning korrarikkujate andmeid. Samas saab ta muuta, kustutada ja lisada igat neist.

Selles projektis on rakendatud MVC (Model View Controller) struktuur. Seega, et tekitada mingit objekti, peame looma uue Model’i ning Controller’i selle jaoks. Seejärel uuendame andmebaasi. Et kuvada andmeid veebilehel, peame tegema View’i ning siduma seda Controller’iga läbi C# koodi. View’i sisene kood on peamiselt HTML.

Kaustad:

Layout

Students

Students kaustas on olemas 5 vaadet (View):
Index, Create, Delete, Details ja Edit.

Index on peavaade, mis kuvab kõikide õppijate loetelu ning laseb muuta/vaadata nende andmeid. Koodina näeb see välja nii:

<h1>Õpilaste loend</h1>
<p>
	<a asp-action="Create">Sisesta Õpilane</a>
</p>
<table class="table">
	<thead>
		<tr>
			<th>
				@Html.DisplayNameFor(Model => Model.LastName)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.FirstName)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.EnrollmentDate)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.Sleepy)
			</th>
		</tr>
	</thead>
	<tbody>
		@foreach (var student in Model)
		{
			<tr>
				<td>
					@Html.DisplayFor(modelItem => student.LastName)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.FirstName)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.EnrollmentDate)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.Sleepy)
				</td>
				<td>
					<a asp-action="Edit" asp-route-id="@student.Id">Muuda</a>
					<a asp-action="Details" asp-route-id="@student.Id">Vaata</a>
					<a asp-action="Delete" asp-route-id="@student.Id">Kustuta</a>
					<a asp-action="Clone" asp-route-id="@student.Id">Kloneeri</a>
				</td>
			</tr>
		}
	</tbody>
</table>

Create vaade laseb haldajal luua uut õpilast:

<h1>Loo uus Õpilane</h1>
<hr />
<div class=="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="LastName" class="control-label"></label>
                <input asp-for="LastName" class="form-control" />
                <span asp-validation-for="LastName" class="text-danger"></span>
            </div>

              <div class="form-group">
                <label asp-for="FirstName" class="control-label"></label>
                <input asp-for="FirstName" class="form-control" />
                <span asp-validation-for="FirstName" class="text-danger"></span>
            </div>

            <div class="form-group">
                <label asp-for="EnrollmentDate" class="control-label"></label>
                <input asp-for="EnrollmentDate" class="form-control" />
                <span asp-validation-for="EnrollmentDate" class="text-danger"></span>
            </div>

             <div class="form-group">
                <label asp-for="Sleepy" class="control-label"></label>
                <input asp-for="Sleepy" class="form-control" />
                <span asp-validation-for="Sleepy" class="text-danger"></span>
            </div>

            <div class="form-group">
                <input type="submit" value="Sisesta" class="btn btn-primary"/>
            </div>


        </form>
    </div>
</div>
<div>
    <a asp-action="Index">Mine tagasi loendisse</a>
</div>

Delete vaade laseb haldajal kustutada olemas olevat õpilast loendist:

<h1>Kustuta õpilane</h1>
<h3>
	Kas oled kindel, et tahad õpilast @Model.FirstName @Model.LastName eemaldada?
</h3>
<div>
	<h4>Õpilane: @Model.FirstName @Model.LastName</h4>
	<hr />
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.LastName)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(model => model.FirstName)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.FirstName)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(model => model.FirstName)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.EnrollmentDate)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(model => model.EnrollmentDate)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Sleepy)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(model => model.Sleepy)</dd>
	</dl>

	@if (Model.Enrollments != null)
	{
		foreach (var courseEnrollment in Model.Enrollments)
		{
			<dl class="row">
				<dd class="col-sm-10"> @courseEnrollment</dd>
			</dl>	

		}
	}

	@if (Model.Smart != null)
	{
		@Model.Smart;
	}

	@if (Model.Tracks != null)
	{
		foreach (var track in Model.Tracks)
		{
			<dl class="row">
				<dd class="col-sm-10">PlaceholderText</dd>
			</dl>
		}

	}

</div>

<form asp-action="Delete">
	<input type="hidden" asp-for="Id"/>
	<input type="submit" value="Kustuta õpilane" class="btn btn-danger"/> | <a asp-></a>
</form>

<form asp-action="Index">
	<input type="submit" value="Tagasi loendisse" class="btn btn-primary" />
</form>

Details vaade laseb haldajal vaadata õpilase infot:

<h1>Detailid</h1>
<div>
	<form asp-action="Details">
	<h4>Õpilane: @Model.FirstName @Model.LastName</h4>
	<hr />
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.LastName)</dt>
		<dt class="col-sm-10">@Html.DisplayFor(model => Model.LastName)</dt>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.FirstName)</dt>
		<dt class="col-sm-10">@Html.DisplayFor(model => Model.FirstName)</dt>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.EnrollmentDate)</dt>
		<dt class="col-sm-10">@Html.DisplayFor(model => Model.EnrollmentDate)</dt>
	</dl>

	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.Sleepy)</dt>
		<dt class="col-sm-10">@Html.DisplayFor(model => Model.Sleepy)</dt>
	</dl>

	@if (Model.Enrollments != null)
	{
		foreach (var courseEnrollment in Model.Enrollments)
		{
			<dl class="row">
				<dd class="col-sm-10">@courseEnrollment</dd>
			</dl>
		}
	}

	@if (Model.Smart != null)
	{
		@Model.Smart;
	}

	@if (Model.Tracks != null)
	{
		foreach (var track in Model.Tracks)
		{
			<dl class="row">
				<dd class="col-sm-10">PlaceholderText</dd>
			</dl>
		}
	}
	</form>
</div>

<form asp-action="Index">
	<input type="submit" value="Tagasi loendisse" class="btn btn-primary" />
</form>

Edit vaade laseb haldajal muuta õpilase andmeid:

<h1>Muuda 6pilase andmeid</h1>
<hr />
<div class=="row">
	<div class="col-md-4">
		<form asp-action="Edit">
			<div asp-validation-summary="ModelOnly" class="text-danger"></div>
			
			<div class="form-group">
				<label asp-for="LastName" class="control-label"></label>
				<input asp-for="LastName" class="form-control" />
				<span asp-validation-for="LastName" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="FirstName" class="control-label"></label>
				<input asp-for="FirstName" class="form-control" />
				<span asp-validation-for="FirstName" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="EnrollmentDate" class="control-label"></label>
				<input asp-for="EnrollmentDate" class="form-control" />
				<span asp-validation-for="EnrollmentDate" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="Sleepy" class="control-label"></label>
				<input asp-for="Sleepy" class="form-control" />
				<span asp-validation-for="Sleepy" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="Smart" class="control-label"></label>
				<input asp-for="Smart" class="form-control" />
				<span asp-validation-for="Smart" class="text-danger"></span>
			</div>


			<div class="form-group">
				<input type="submit" value="Muuda" class="btn btn-primary"
			</div>

		</form>
	</div>
</div>

<div>
	<a asp-action="Index">Tagasi loendisse</a>
</div>

Instructors ehk õpetajate kaustas on ka 5 vaadet, Create, Delete, Details, Edit:

Index on Instructors’i peavaade, mis kuvab kõikide õpetajate loetelu ning võimalusi muuta ja vaadata nende andmeid. Koodina näeb see välja nii:

<h2>Õpetajad</h2>
<p>
	<a asp-action="Create"> Lisa õpetaja</a>
</p>

<table class="table">
	<thead>
		<tr>
			<th>Perekonnanimi</th>
			<th>Eesnimi</th>
			<th>Töölevõtukuupäev</th>
			<th>Telefoninumber</th>
			<th>Alkohoolik</th>
			<th>Vangis olnud</th>
			<th>🛠Tööriistad</th>
		</tr>
	</thead>
	<tbody>
		@foreach (var instructor in Model.Instructors)
		{
			string selectedRow = "";

			if (instructor.ID == (int?)ViewData["InstructorID"])
			{
				selectedRow = "table-success";
			}
			<tr class="selectedRow">
				<td>@Html.DisplayFor(modelItem => instructor.LastName)</td>
				<td>@Html.DisplayFor(modelItem => instructor.FirstName)</td>
				<td>@Html.DisplayFor(modelItem => instructor.HireDate)</td>
				<td>
					@if (instructor.OfficeAssignments != null)
					{
						@instructor.OfficeAssignments.Location

					}
				</td>
				<td>
					@foreach (var course in instructor.CourseAssignments)
					{
						@course.Course.CourseId @: @course.Course.Title <br/>
					}
				</td>
				<td>@Html.DisplayFor(modelItem => instructor.BeenInJail)</td>
				<td>
					<a asp-action="QuickAction" asp-route-id="@instructor.ID">Muuda</a>
					<a asp-action="Details" asp-route-id="@instructor.ID">Vaata</a>
					<a asp-action="Delete" asp-route-id="@instructor.ID">Kustuta</a>
				</td>

			</tr>

		}
	</tbody>
</table>

Create vaade lubab haldajal luua uue õpetaja:

<h2>Õpetajad</h2>
<p>
	<a asp-action="Create"> Lisa õpetaja</a>
</p>

<table class="table">
	<thead>
		<tr>
			<th>Perekonnanimi</th>
			<th>Eesnimi</th>
			<th>Töölevõtukuupäev</th>
			<th>Telefoninumber</th>
			<th>Alkohoolik</th>
			<th>Vangis olnud</th>
			<th>🛠Tööriistad</th>
		</tr>
	</thead>
	<tbody>
		@foreach (var instructor in Model.Instructors)
		{
			string selectedRow = "";

			if (instructor.ID == (int?)ViewData["InstructorID"])
			{
				selectedRow = "table-success";
			}
			<tr class="selectedRow">
				<td>@Html.DisplayFor(modelItem => instructor.LastName)</td>
				<td>@Html.DisplayFor(modelItem => instructor.FirstName)</td>
				<td>@Html.DisplayFor(modelItem => instructor.HireDate)</td>
				<td>
					@if (instructor.OfficeAssignments != null)
					{
						@instructor.OfficeAssignments.Location

					}
				</td>
				<td>
					@foreach (var course in instructor.CourseAssignments)
					{
						@course.Course.CourseId @: @course.Course.Title <br/>
					}
				</td>
				<td>@Html.DisplayFor(modelItem => instructor.BeenInJail)</td>
				<td>
					<a asp-action="QuickAction" asp-route-id="@instructor.ID">Muuda</a>
					<a asp-action="Details" asp-route-id="@instructor.ID">Vaata</a>
					<a asp-action="Delete" asp-route-id="@instructor.ID">Kustuta</a>
				</td>

			</tr>

		}
	</tbody>
</table>

Delete vaade lubab haldajal kustutada õpetaja loetelust:

<h1>Kustuta õpetaja</h1>
<h3>Kas soovid kustutada @Html.DisplayFor(model => model.FullName)</h3>
<div>
	<h4>õpetaja</h4>
	<hr />
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.LastName)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.LastName)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.FirstName)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.FirstName)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.PhoneNumber)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.PhoneNumber)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Alcoholic)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.Alcoholic)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.BeenInJail)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.BeenInJail)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.CourseAssignments)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.CourseAssignments)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.OfficeAssignments)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.OfficeAssignments)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.HireDate)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.HireDate)</dt>
	</dl>

	<form asp-action="Delete">
		<input type="hidden" asp-for="ID"/>
		<input type="submit" value="Kustuta" class="btn btn-danger" /> | <a asp-action="Index">Tühista</a>
	</form>
</div>

Details vaade lubab haldajal vaadata õpetaja andmeid:

<h1>Detailid</h1>
<div>
	<form asp-action="Details">
		<h4>Õpetaja: @Model.FirstName @Model.LastName</h4>
		<hr />
		<dl class="row">
			<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.LastName)</dt>
			<dt class="col-sm-2">@Html.DisplayFor(model => Model.LastName)</dt>
		</dl>

		<dl class="row">
			<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.FirstName)</dt>
			<dt class="col-sm-2">@Html.DisplayFor(model => Model.FirstName)</dt>
		</dl>

		<dl class="row">
			<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.HireDate)</dt>
			<dt class="col-sm-2">@Html.DisplayFor(model => Model.HireDate)</dt>
		</dl>

		<dl class="row">
			<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.Alcoholic)</dt>
			<dt class="col-sm-2">@Html.DisplayFor(model => Model.Alcoholic)</dt>
		</dl>

		<dl class="row">
			<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.BeenInJail)</dt>
			<dt class="col-sm-2">@Html.DisplayFor(model => Model.BeenInJail)</dt>
		</dl>

		<dl class="row">
			<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.PhoneNumber)</dt>
			<dt class="col-sm-2">@Html.DisplayFor(model => Model.PhoneNumber)</dt>
		</dl>

		@if (Model.CourseAssignments != null)
		{
			foreach (var courseAssignment in Model.CourseAssignments)
			{
				<dl class="row">
					<dd class="col-sm-10">@courseAssignment</dd>
				</dl>
			}	
		}

		
	</form>
</div>

<form asp-action="Index">
	<input type="submit" value="Tagasi loendisse" class="btn btn-primary" />
</form>

Edit vaade lubab haldajal muuta õpetaja andmeid:

<h1>Muuda õpetaja andmed</h1>
<hr />
<div class=="row">
	<div class="col-md-4">
		<form asp-action="Edit">
			<div asp-validation-summary="ModelOnly" class="text-danger"></div>

			<div class="form-group">
				<label asp-for="LastName" class="control-label"></label>
				<input asp-for="LastName" class="form-control" />
				<span asp-validation-for="LastName" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="FirstName" class="control-label"></label>
				<input asp-for="FirstName" class="form-control" />
				<span asp-validation-for="FirstName" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="HireDate" class="control-label"></label>
				<input asp-for="HireDate" class="form-control" />
				<span asp-validation-for="HireDate" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="PhoneNumber" class="control-label"></label>
				<input asp-for="PhoneNumber" class="form-control" />
				<span asp-validation-for="PhoneNumber" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="Alcoholic" class="control-label"></label>
				<input asp-for="Alcoholic" class="form-control" />
				<span asp-validation-for="Alcoholic" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="BeenInJail" class="control-label"></label>
				<input asp-for="BeenInJail" class="form-control" />
				<span asp-validation-for="BeenInJail" class="text-danger"></span>
			</div>

			<div class="form-group">
				<input type="submit" value="Muuda" class="btn btn-primary" />
			</div>

		</form>
	</div>
</div>

<div>
	<a asp-action="Index">Tagasi loendisse</a>
</div>

Departments

Index Departments ehk osakonnade peavaade, mis kuvab kõikide osakonnade loetelu ning võimalusi muuta ja vaadata nende andmeid. Koodina näeb see välja nii:

<h1>Osakonnad</h1>
<p>
	<a asp-action="Create">Loo uus osakond</a>
</p>

<table class="table">
	<thead>
		<tr>
			<th>@Html.DisplayNameFor(model => model.Name)</th>
			<th>@Html.DisplayNameFor(model => model.Budget)</th>
			<th>@Html.DisplayNameFor(model => model.StartDate)</th>
			<th>@Html.DisplayNameFor(model => model.Administrator)</th>
			<th>@Html.DisplayNameFor(model => model.RawVersion)</th>
			<th>@Html.DisplayNameFor(model => model.CurrentStatus)</th>
			<th>Tööriistad</th>
		</tr>
	</thead>
	<tbody>
			@foreach (var department in Model) 
			{
				<tr>
					<td>@Html.DisplayFor(modelItem => department.Name)</td>
					<td>@Html.DisplayFor(modelItem => department.Budget)</td>
					<td>@Html.DisplayFor(modelItem => department.StartDate)</td>
					<td>@Html.DisplayFor(modelItem => department.Administrator)</td>
					<td>@Html.DisplayFor(modelItem => department.RawVersion)</td>
					<td>@Html.DisplayFor(modelItem => department.CurrentStatus)</td>
					<td>
						@* /* Muuda */ *@
						@* /* Vaata */ *@
						@* /* Vaata Administraatorit*/ *@
						@* /* Kustuta */ *@
						<a asp-action="Delete" asp-route-id="@department.DepartmentID" class="btn btn-danger">Eemalda</a>
						<a asp-action="Details" asp-route-id="@department.DepartmentID" class="btn btn-primary">Vaata</a>
						<a asp-action="Edit" asp-route-id="@department.DepartmentID" class="btn btn-primary">Muuda</a>
					</td>
				</tr>
			}
	</tbody>
</table>

Create/Edit on topeltvaade, mis kuvab ühte kahest vaadest mingil tingimusel.

Create osa lubab haldajal luua uue osakonna:

@if (ViewBag.SelectedAction == "Create")
{
	<h1>Asuta uus osakond</h1>
	<hr />
	<div class="row">
		<div class="col-md-4"> 
			<form asp-action="Create">

				<input type="hidden" asp-for="RawVersion" value="@Html.Raw("0")" />
				<div asp-validation-summary="ModelOnly" class="text-danger"></div>

				<div class="form-group">
					<label asp-for="Name" class="control-label">Name</label>
					<input asp-for="Name" class="control-label" />
					<span asp-validation-for="Name" class="text-danger" />
				</div>

				<div class="form-group">
					<label asp-for="Budget" class="control-label">Budget</label>
					<input asp-for="Budget" class="control-label" />
					<span asp-validation-for="Budget" class="text-danger" />
				</div>

				<div class="form-group">
					<label asp-for="StartDate" class="control-label">StartDate</label>
					<input asp-for="StartDate" class="control-label" />
					<span asp-validation-for="StartDate" class="text-danger" />
				</div>

				<div class="form-group">
					<label asp-for="InstructorID" class="control-label">InstructorID</label>
					<select asp-for="InstructorID" class="control-label" asp-items="ViewBag.InstructorID">
						<option value=""> --Palun Vali Opetaja-- </option>
					</select>
					<span asp-validation-for="InstructorID" class="text-danger" />
				</div>


				<div class="form-group">
					<label asp-for="StudentsDroppedOut" class="control-label">StudentsDroppedOut</label>
					<input asp-for="StudentsDroppedOut" class="control-label" />
					<span asp-validation-for="StudentsDroppedOut" class="text-danger" />
				</div>

				<div class="form-group">
					<label asp-for="TotalGraduates" class="control-label">TotalGraduates</label>
					<input asp-for="TotalGraduates" class="control-label" />
					<span asp-validation-for="TotalGraduates" class="text-danger" />
				</div>

				<div class="form-group">
					<label asp-for="Administrator" class="control-label">Administrator</label>
					<input asp-for="Administrator" class="control-label" />
					<span asp-validation-for="Administrator" class="text-danger" />
				</div>

				<div class="form-group">
					<input type="submit" value="Loo" class="btn btn-primary"/> | <a asp-action="Index" class="btn btn-danger">Tühista</a>
				</div>

			</form>
		</div>

	</div>
}

Edit osa lubab haldajal muuta osakonna andmeid:

else
{

	<h1>Muuda </h1>
	<div>
		<h2>Muuda osakonna andmed</h2>
		<hr />
		<div class="row">
			<div class="col-md-4">
					<form asp-action="Edit">
						<input type="hidden" asp-for="RawVersion" value="@Html.Raw(Model.DepartmentID)" />

						<div asp-validation-summary="ModelOnly" class="text-danger"></div>
						
						<input type="hidden" asp-for="DepartmentID" />

						<div class="form-group">
							<label asp-for="Name" class="control-label">Name</label>
							<input asp-for="Name" class="control-label" />
							<span asp-validation-for="Name" class="text-danger" />
						</div>

						<div class="form-group">
							<label asp-for="Budget" class="control-label">Budget</label>
							<input asp-for="Budget" class="control-label" />
							<span asp-validation-for="Budget" class="text-danger" />
						</div>

						<div class="form-group">
							<label asp-for="StartDate" class="control-label">StartDate</label>
							<input asp-for="StartDate" class="control-label" />
							<span asp-validation-for="StartDate" class="text-danger" />
						</div>

						<div class="form-group">
							<label asp-for="InstructorID" class="control-label">InstructorID</label>
							<select asp-for="InstructorID" class="control-label" asp-items="ViewBag.InstructorID">
								<option value=""> --Palun Vali Opetaja-- </option>
							</select>
							<span asp-validation-for="InstructorID" class="text-danger" />
						</div>


						<div class="form-group">
							<label asp-for="StudentsDroppedOut" class="control-label">StudentsDroppedOut</label>
							<input asp-for="StudentsDroppedOut" class="control-label" />
							<span asp-validation-for="StudentsDroppedOut" class="text-danger" />
						</div>

						<div class="form-group">
							<label asp-for="TotalGraduates" class="control-label">TotalGraduates</label>
							<input asp-for="TotalGraduates" class="control-label" />
							<span asp-validation-for="TotalGraduates" class="text-danger" />
						</div>

						<div class="form-group">
							<label asp-for="Administrator" class="control-label">Administrator</label>
							<input asp-for="Administrator" class="control-label" />
							<span asp-validation-for="Administrator" class="text-danger" />
						</div>

						<div class="form-group">
							<input type="submit" value="Muuda" class="btn btn-primary" /> | <a asp-action="Index" class="btn btn-danger">Tühista</a>
						</div>

					</form>
			</div>
		</div>

	</div>

}

Delete/Details on topeltvaade, mis kuvab osakonna andmeid, aga kustutada laseb ainult ühel tingimusel.

Details ehk andmete kuvamise osa:

<dl class="row">
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Name)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.Name)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.DepartmentID)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.DepartmentID)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.TotalGraduates)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.TotalGraduates)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Budget)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.Budget)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.StartDate)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.StartDate)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.InstructorID)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.InstructorID)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.CurrentStatus)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.CurrentStatus)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.StudentsDroppedOut)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.StudentsDroppedOut)</dt>
</dl>

Delete osa ehk HTML vorm, mis laseb kinnitada kustutamise:

<form asp-action="Delete">
	<input type="hidden" asp-for="DepartmentID" />
	<input type="hidden" asp-for="RawVersion" />
	@if (ViewBag.SelectedAction == "Delete")
	{
		<input type="submit" value="Kustuta" class="btn btn-danger" /> 
	}
	<a asp-action="Index">Tühista</a>
</form>

Courses

Index on Courses ehk kursuste peavaade, mis kuvab kõikide kursuste loetelu ning võimalusi muuta ja vaadata nende andmeid. Koodina näeb see välja nii:

<h2>Kursused</h2>
<p>
	<a asp-action="Create">Loo uus kursus</a>
</p>

<table class="table">
	<thead>
		<tr>
			<th>@Html.DisplayNameFor(model => model.CourseId)</th>
			<th>@Html.DisplayNameFor(model => model.Title)</th>
			<th>@Html.DisplayNameFor(model => model.Credits)</th>
			<th>@Html.DisplayNameFor(model => model.Department.Name)</th>
			@*<th>@Html.DisplayNameFor(model => model.Department.Administrator.FullName)</th> *@
			<th>Tööriistad</th>
		</tr>
	</thead>
	<tbody>
		@foreach (var course in Model)
		{
			<tr>
				<td>
					@Html.DisplayFor(modelItem => course.CourseId)
				</td>

				<td>
					@Html.DisplayFor(modelItem => course.Title)
				</td>

				<td>
					@Html.DisplayFor(modelItem => course.Credits)
				</td>

				<td>
					@Html.DisplayFor(modelItem => course.Department.Name)
				</td>

				@* <td>
					@Html.DisplayFor(modelItem => course.Department.Administrator.FullName)
				</td>*@
				<td>
					<a asp-action="Delete" asp-route-id="@course.CourseId">Kustuta</a>
					<a asp-action="Details" asp-route-id="@course.CourseId">Vaata</a>
					<a asp-action="Edit" asp-route-id="@course.CourseId">Muuda</a>
				</td>
				
			</tr>
		}
	</tbody>
</table>

Create/Edit on topeltvaade, mis kuvab ühte kahest vaadest mingil tingimusel.

Create osa lubab haldajal luua uue kursuse:

@if (ViewBag.SelectedAction == "Create")
{
	<h1>Tee uus kursus</h1>
	<h4>Sisesta info:</h4>
	<hr />
	<div class="row">
		<div class="col-md-4">
			<form asp-action="Create">
				<div asp-validation-summary="ModelOnly" class="text-danger"></div>
				
				@* <div>
				<label asp-for="CourseId" class="control-label"></label>
				<input asp-for="CourseId" class="form-control" />
				<span asp-validation-for="CourseId" class="text-danger"></span>
			</div> *@

				<div>
					<label asp-for="Title" class="control-label"></label>
					<input asp-for="Title" class="form-control" />
					<span asp-validation-for="Title" class="text-danger"></span>
				</div>

				<div>
					<label asp-for="Credits" class="control-label"></label>
					<input asp-for="Credits" class="form-control" />
					<span asp-validation-for="Credits" class="text-danger"></span>
				</div>

				<div>
					<label asp-for="Department" class="control-label"></label>
					<select asp-for="DepartmentID" class="form-control" asp-items="ViewBag.DepartmentID">
						<option value="" class="form-control"> --Vali osakond--</option>
					</select>

					<span asp-validation-for="DepartmentID" class="text-danger"></span>
				</div>
				<div class="form-group">
					<input type="submit" value="Tee uus" class="btn btn-primary" /> | <a asp-action="Index" class="btn btn-outline-primary">Tühista</a> 
				</div>

			</form>
		</div>
	</div>
}

Edit osa lubab haldaja muuta kursuse andmeid:

else
{
	<h1>Muuda</h1>
	<div>
		<h2>Muuda kursuse andmed</h2>
		<hr />
		<div class="row">
			<div class="col-md-4">
				<form asp-action="Edit">
					<div asp-validation-summary="ModelOnly" class="text-danger"></div>
					<input type="hidden" asp-for="CourseId" />

					<div class="form-group">
						<label asp-for="Title" class="control-label">Title</label>
						<input asp-for="Title" class="control-label"/>
						<span asp-validation-for="Title" class="text-danger" />
					</div>
					
					<div class="form-group">
						<label asp-for="Credits" class="control-label">Credits</label>
						<input asp-for="Credits" class="control-label" />
						<span asp-validation-for="Credits" class="text-danger" />
					</div>
					
					<div class="form-group">
						<label asp-for="Department" class="control-label">Department</label>
						<select asp-for="DepartmentID" class="form-control" asp-items="ViewBag.DepartmentID">
							<option value="" class="form-control"> --Vali osakond--</option>
						</select>

						<span asp-validation-for="DepartmentID" class="text-danger"></span>

					</div>
					
					<div class="form-group">
						<input type="submit" value="Muuda" class="btn btn-primary" />
					</div>

				</form>
			</div>
		</div>
	</div>
}

Delete/Details on topeltvaade, mis kuvab kursuste andmeid, aga kustutada laseb ainult ühel tingimusel.

Details ehk andmete kuvamise osa:

<dl class="row">
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Title)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.Title)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.CourseId)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.CourseId)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Credits)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.Credits)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Department)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.Department)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.DepartmentID)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.DepartmentID)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Enrollments)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.Enrollments)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(model => model.CourseAssignments)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(model => model.CourseAssignments)</dt>
</dl>

Delete osa ehk HTML vorm, mis laseb kinnitada kustutamise:

&lt;form asp-action="Delete">
	&lt;input type="hidden" asp-for="CourseId" />
	@if (ViewBag.SelectedAction == "Delete")
	{
		&lt;input type="submit" value="Kustuta" class="btn btn-danger" />
	}
	&lt;a asp-action="Index">Tühista&lt;/a>

&lt;/form>

Delinquents

Index on Delinquents ehk korrarikkujate peavaade, mis kuvab kõikide korrarikkujate loetelu ning võimalusi muuta ja vaadata nende andmeid. Koodina näeb see välja nii:

<h2>Korrarikkujad</h2>
<p>
	<a asp-action="Create">Lisa uus korrarikkuja</a>
</p>

<table class="table">
	<thead>
		<tr>
			<th>@Html.DisplayNameFor(model => model.DelinquentID)</th>
			<th>@Html.DisplayNameFor(model => model.LastName)</th>
			<th>@Html.DisplayNameFor(model => model.FirstName)</th>
			<th>@Html.DisplayNameFor(model => model.Violation)</th>
			<th>@Html.DisplayNameFor(model => model.DelinquentType)</th>
			<th>@Html.DisplayNameFor(model => model.Description)</th>
			<th>Tööriistad</th>
		</tr>
	</thead>
	<tbody>
		@foreach (var delinquent in Model)
		{
			<tr>
				<td>
					@Html.DisplayFor(modelItem => delinquent.DelinquentID)
				</td>

				<td>
					@Html.DisplayFor(modelItem => delinquent.LastName)
				</td>

				<td>
					@Html.DisplayFor(modelItem => delinquent.FirstName)
				</td>

				<td>
					@Html.DisplayFor(modelItem => delinquent.Violation)
				</td>

				<td>
					@Html.DisplayFor(modelItem => delinquent.DelinquentType)
				</td>

				<td>
					@Html.DisplayFor(modelItem => delinquent.Description)
				</td>

				<td>
					<a asp-action="Delete" asp-route-id="@delinquent.DelinquentID">Kustuta</a>
					<a asp-action="Details" asp-route-id="@delinquent.DelinquentID">Vaata</a>
					<a asp-action="Edit" asp-route-id="@delinquent.DelinquentID">Muuda</a>
				</td>

			</tr>
		}
	</tbody>
</table>

Create lubab haldajal lisada uue korrarikkuja:

<h1>Lisa uus korrarikkuja</h1>
<h4>Sisesta info:</h4>
<hr />
<div class="row">
	<div class="col-md-4">
		<form asp-action="Create">
			<div asp-validation-summary="ModelOnly" class="text-danger"></div>
			<div>
				<label asp-for="LastName" class="control-label">LastName</label>
				<input asp-for="LastName" class="form-control" />
				<span asp-validation-for="LastName" class="text-danger"></span>
			</div>

			<div>
				<label asp-for="FirstName" class="control-label">FirstName</label>
				<input asp-for="FirstName" class="form-control" />
				<span asp-validation-for="FirstName" class="text-danger"></span>
			</div>

			<div>
				<label asp-for="Violation" class="control-label">Violation</label>
				<select asp-for="Violation" class="form-control" asp-items="ViewBag.ViolationList">
					<option value="" class="form-control">--Vali osakond--</option>
				</select>
				<span asp-validation-for="Violation" class="text-danger"></span>
			</div>
			
			<div>
				<label asp-for="DelinquentType" class="control-label">DelinquentType</label>
				<select asp-for="DelinquentType" class="form-control" asp-items="ViewBag.DelinquentTypes">
					<option value="" class="form-control">--Vali osakond--</option>
				</select>
				<span asp-validation-for="DelinquentType" class="text-danger"></span>
			</div>

			<div>
				<label asp-for="Description" class="control-label">Description</label>
				<input asp-for="Description" class="from-control" />
				<span asp-validation-for="Description" class="text-danger"></span>
			</div>
		
			<div class="form-group">
				<input type="submit" value="Lisa uus korrarikkuja" class="btn btn-primary" />
			</div>
		</form>
	</div>
</div>

<div>
	<a asp-action="Index">Tagasi loendisse</a>
</div>

Delete vaade lubab haldajal kustutada korrarikkuja loetelust:

<h1>Kustuta korrarikkuja</h1>

<div>
	<hr/>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.DelinquentID)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => Model.DelinquentID)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.LastName)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => Model.LastName)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.FirstName)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => Model.FirstName)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.Violation)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => Model.Violation)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.DelinquentType)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => Model.DelinquentType)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(model => Model.Description)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => Model.Description)</dt>
	</dl>

	<form asp-action="Delete">
		<input type="hidden" asp-for="DelinquentID" />
		<input type="submit" value="Kustuta" class="btn btn-danger" />
		<a asp-action="Index">Tühista</a>
	</form>
</div>

Details vaade lubab haldajal vaadata korrarikkuja andmeid:

<h2>@Html.DisplayFor(modelItem => Model.FirstName) @Html.DisplayFor(modelItem => Model.LastName)</h2>
<p>
	<h3>Detailid</h3>
</p>

<div>
	<hr />
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(modelItem => Model.DelinquentID)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(modelItem => Model.DelinquentID)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(modelItem => Model.LastName)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(modelItem => Model.LastName)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(modelItem => Model.FirstName)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(modelItem => Model.FirstName)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(modelItem => Model.Violation)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(modelItem => Model.Violation)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(modelItem => Model.DelinquentType)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(modelItem => Model.DelinquentType)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(modelItem => Model.Description)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(modelItem => Model.Description)</dt>
	</dl>

	<a asp-action="Index">Tagasi loendisse</a>
</div>

Edit vaade lubab haldajal muuta korrarikkuja andmeid:

<h1>Muuda</h1>
<div>
	<h2>Muuda kursuse andmed</h2>
	<hr />
	<div class="row">
		<div class="col-md-4">
			<form asp-action="Edit">
				<div asp-validation-summary=ModelOnly class="text-danger"></div>
				<input type="hidden" asp-for="DelinquentID" />
				
				<div class="form-group">
					<label asp-for="LastName" class="control-label">Last Name</label>
					<input asp-for="LastName" class="control-label" />
					<span asp-validation-for="LastName" class="text-danger"></span>
				</div>
				
				<div class="form-group">
					<label asp-for="FirstName" class="control-label">First Name</label>
					<input asp-for="FirstName" class="control-label" />
					<span asp-validation-for="FirstName" class="text-danger"></span>
				</div>
				
				<div class="form-group">
					<label asp-for="Violation" class="control-label">Violation</label>
					<select asp-for="Violation" class="form-control" asp-items="ViewBag.ViolationList">
						<option value="" class="form-control">--Vali korrarikkumise liigi</option>
					</select>
					<span asp-validation-for="Violation" class="text-danger"></span>
				</div>
				
				<div class="form-group">
					<label asp-for="DelinquentType" class="control-label">Delinquent Type</label>
					<select asp-for="DelinquentType" class="form-control" asp-items="ViewBag.DelinquentTypes">
						<option value="" class="form-control">--Vali korrarikkuja liigi--</option>
					</select>
					<span asp-validation-for="DelinquentType" class="text-danger"></span>
				</div>
				
				<div class="form-group">
					<label asp-for="Description" class="control-label">Description</label>
					<input asp-for="Description" class="control-label" />
					<span asp-validation-for="Description" class="text-danger"></span>
				</div>
				
				<div class="form-group">
					<input type="submit" value="Muuda" class="btn btn-primary" />
				</div>

			</form>
		</div>
	</div>
</div>

<div>

Kontrollerid:

StudentsController

StudentsController vastutab andmevahetuse eest Students mudeli ja vaadete vahel.

Constructor meetod võtab parameetriks, meie andmebaasi konteksti ning seab _context muutujale selle väärtust

private readonly SchoolContext _context;
public StudentsController(SchoolContext context)
{
    _context = context;
}

Index meetod leiab õppija mudelite loetelu kontekstis kasutades funktsiooni ToListAsync() ning tagastab seda loetelu vaadesse.

 public async Task&lt;IActionResult> Index()
 {

     return View(await _context.Students.ToListAsync());
 }

Create Get meetod tagastab samanimelise vaade.

[HttpGet]
public IActionResult Create()
{
    return View();
}

Create Post meetod loob uue Students mudeli, antud andmetega. Kontrollib, kas mudel valideerub, siis lisab Students kontekstisse uue õppija mudeli, salvestab konteksti muutusi asünkroonselt ning suunab ümber Index meetodisse.
Juhul kui mudel ei valideeru, meetod tagastab samanimelise vaadet koos juba sisestatud õppija andmetega.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID, LastName, FirstName, EnrollmentDate, Sleepy")] Student student)
{
    if (ModelState.IsValid)
    {
        _context.Students.Add(student);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
        // return RedirectToAction(nameof(Index));
    }
    return View(student);
}

Delete Get meetod võtab valikulise parameetrina õpilase id’t. Kui parameeter on tühi, siis meetod tagastab Error 404 “Ei leitud”. Vastasel juhul meetod otsib õpilase mudelit, kasutades asünkroonset link funktsiooni FirstOrDefaultAsync, mis tagastab esimest andmemudelit, mis rahuldab tingimust (mudeli Id peab vastama parameeterina antud id’le). Juhul kui õpilase mudel on tühi, tagastame Error 404 ‘Ei leitud’. Vastasel juhul meetod tagastab samanimelise vaade ning annab sellele üle valitud õpilase andmemudelit.

 [HttpGet]
 public async Task<IActionResult> Delete(int? id)
 { 
     if (id == null)
     {
         return NotFound();
     }
     var student = await _context.Students.FirstOrDefaultAsync(m => m.Id == id);
     if (student == null)
     {
         return NotFound();
     }
     return View(student);
 }

Delete Post meetod. Võtab vastu kohustuslikku parameetri id ning otsib valitud õpilase Students kontekstis kasutades asükroonse link funktsiooni FindAsync, mis leiab andmemudeli antud id’ga. Siis Students konteksist eemaldatakse antud andmemudel ning koneksti muutuseid asünkroonselt salvestatakse. Meetod suunab kasutaja üle Index meetodisse.

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    var student = await _context.Students.FindAsync(id);
    _context.Students.Remove(student);
    await _context.SaveChangesAsync();
    return RedirectToAction("Index");
}

Details Get meetod võtab vastu valikulise parameetri id ning kontrollib, kas id on tühi, juhul kui jah: tagastab Error 404, ‘Ei leitud’. Juhul kui id on olemas, otsib õpilase andmemudelit Students kontekstis, kasutades asünkroonse funktsiooni FindAsync(), mis tagastab andmemudelit antud id’ga. Kui õpilase andmemudel on tühi, siis tagastab Error 404, ‘Ei leitud’. Vastasel juhul, tagastab samanimelise vaade ning annab sellele üle õpilase andemudelit.

[HttpGet]
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var student = await _context.Students.FindAsync(id);
    if (student == null)
    {
        return NotFound();
    }
    return View(student);
}

Details Post meetod suunab kasutajat üle Indeks meetodisse

public async Task<IActionResult> CloseDetails()
{
    return RedirectToAction("Index");
}

Edit Get meetod võtab vastu valikulise parameetri id ning kontrollib kas see on tühi, kui jah siis: tagastab Error 404, ‘Ei leitud’. Vastasel juhul leiab õpilase andmemudeli Students kontekstist kasutades asünkroonse link funktsiooni FindAsync(), mis leiab andmemudeli antud id’ga. Kui andmemudel on tühi, tagastab Error 404, ‘Ei leitud’. Vastasel juhul tagastab samanimelise vaade ning annab sellele üle õpilase andmemudeli.

[HttpGet]
public async Task<IActionResult> Edit(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var student = await _context.Students.FindAsync(id);
    if (student == null)
    {
        return NotFound();
    }
    return View(student);
}

Edit Post meetod, võtab vastu kohustulikku parameetri student, ning kontrollib kas see andmemudel valideerub, kui ei: tagastab sama vaadet tagasi. Vastasel juhul uuendab Students kontekstis asuvat õpilase antud andmemudeli, asünkroonselt salvestab muutusi ning suunab kasutaja Index meetodisse.

[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit([Bind("Id, LastName, FirstName, EnrollmentDate, Sleepy, Smart")] Student student)
{
    if (ModelState.IsValid)
    {
        _context.Students.Update(student);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(student);
}

InstructorsController

Constructor meetod võtab parameetriks, meie andmebaasi konteksti ning seab _context muutujale selle väärtust

private readonly SchoolContext _context;
public InstructorsController(SchoolContext context)
{
    _context = context;
}

Index meetod võtab valikulisteks parameetriteks id ja courseId ninb määrab muutujaks vm InstructorIndexData viewmodeli. Siis meetod lisab vm.Instructors’isse õpetajate loendi ja määrab OfficeAssignments ja Assignments sidumist loendi objektidega kasutades Include() funktsiooni. Pärast õpetajate mudelite leidmist, asünkroonselt tagastab neid ühte loendina. Ja lõpuks tagastab vaadet koos õpetajate loendiga.

public async Task&lt;IActionResult> Index(int? id, int? courseId)
{
    var vm = new InstructorIndexData();
    vm.Instructors = await _context.Instructors
        .Include(i => i.OfficeAssignments)
        .Include(i => i.CourseAssignments)
        .ToListAsync();
    return View(vm);
}

Create Get meetod loob uue õpetaja mudeli ning lisab selle attribuutile CourseAssignments listi tüübi CourseAssignments. Tagastab samanimelise vaade

[HttpGet]
public IActionResult Create()
{
    var instructor = new Instructor();
    instructor.CourseAssignments = new List<CourseAssignment>();
    return View();
}

Create Post meetod võtab kohustuslikuks parameetriks õpetaja mudelit ja valitudkursused. Kui valitudkursused ei ole tühi, meetod võtab igat kursust valitudkursustest, seab InstructorID’t ja CourseID’t ning lisab seda õpetaja CourseAssignments’itesse.
Meetod kustutab valitudkursuseid ModelState’st. Kui ModelState valideerub, siis kontekstisse lisatakse uue õpetaja mudeli, asünkroonselt salvestatakse muutuseid ning ümbersuunatakse kasutajat Index meetodisse. Vastasel juhul, tagastatakse Create vaade koos õpetaja mudeli andmetega.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Instructor instructor, string selectedCourses)
{
    if (selectedCourses != null)
    {
        instructor.CourseAssignments = new List<CourseAssignment>();
        foreach (var course in selectedCourses)
        {
            var courseToAdd = new CourseAssignment
            {
                InstructorID = instructor.ID,
                CourseID = course,

            };
            instructor.CourseAssignments.Add(courseToAdd);
        }
    }
    ModelState.Remove("selectedCourses");
    if (ModelState.IsValid)
    {
        _context.Add(instructor);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }

    //  PopulateAssignedCourseData(instructor);
    return View(instructor);
}

Delete Get meetod võtab valikulisteks parameetriteks id ja SaveChangesError.
Kui id on tühi, siis tagastab Error 404, ‘Ei leitud’. Vastasel juhul, määrab mutuuja deletableInstructor’i väärtuseks, kontekstist valitud õpetaja mudeli, kasutades asünkroonset linq funktsiooni FirstOrDefaultASync(), mis tagastab objekti, mis rahuldab antud tingimust. Kui deletableInstructor on tühi, siis tagastab Error 404, ‘Ei leitud’. Vastasel juhul tagastab samanimelise vaade koos valitud õpetaja andmemudeliga.

[HttpGet]
public async Task<IActionResult> Delete(int? id, bool? saveChangesError = false)
{
    if (id == null)
    {
        return NotFound();
    }
    var deletableInstructor = await _context.Instructors
        .FirstOrDefaultAsync(s => s.ID == id);
    if (deletableInstructor == null)
    {
        return NotFound();
    }

    return View(deletableInstructor);
}

Delete Post meetod võtab kohustuslikuks parameetriks id ning otsib ainust õpetaja modeli kontekstis mille id vastab parameetrile, kasutaes asünkroonset linq funktsiooni SingleAsync(). Siis kontekstist kustutatakse valitud õpetaja mudeli, asünkroonselt salvestatakse muutuseid ja teeb ümbersuunamise Index meetodisse.

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    Instructor deletableInstructor = await _context.Instructors
        .SingleAsync(i => i.ID == id);
    _context.Instructors.Remove(deletableInstructor);
    await _context.SaveChangesAsync();
    return RedirectToAction("Index");
}

Details Get meetod võtab vastu parameetrina id. Seejärel kontrollib kas id on olemas ning leiab nõutud õpetajat kasutades .FindAsync() funktsiooni, mis leiab asünkroonselt objekti andmebaasikontekstist mingi omaduse põhjal (id). Kui õpetaja objekt on olemas, siis meetod tagastab vastavat vaadet. Teisel juhul kasutaja saab Error 404 vaadet.

 [HttpGet]
 public async Task<IActionResult> Details(int? id)
 {
     if (id == null)
     {
         return NotFound();
     }
     var instructor = await _context.Instructors.FindAsync(id);
     if (instructor == null)
     {
         return NotFound();
     }
     return View(instructor);
 }

Departments Controller

Constructor meetod registreerib Andmebaasikonteksti kasutades Dependecy Injection’i põhimõttet.

 public DepartmentsController(SchoolContext context)
 {
     _context = context;
 }

Index meetod kuvab vaadet kõikide osakondadega ja nende administraatoritega. Viimase kuvamiseks kasutab see .Include() meetodid, mis võtab muutujaks d, mis vastab valitud osakonna administraatorile (seotud õpetaja).

public async Task<IActionResult> Index()
{
    var schoolContext = _context.Departments.Include(d => d.Administrator);
    return View(await schoolContext.ToListAsync());
}

Create GET meetod loob uue ViewData’t “InstructorID”, mis on SelectList õpetajate ID ja nimedega ning “SelectedAction” väärtus on “Create”. Seejärel kuvab vastavat vaadet.

[HttpGet]
public IActionResult Create()
{
    ViewData["InstructorID"] = new SelectList(_context.Instructors, "ID", "FullName");
    // ViewData["CourseStatus"] = new SelectList(_context.Students, "Id", _context.Departments.CurrentStatus);
    ViewData["SelectedAction"] = "Create";
    return View();
}

Create POST meetod võtab vastu kõiki kohustuslike andmeid ning kontrollib kas andmemudel valideerub. Juhul kui jah, andmebaasi lisatakse antud osakond, salvestatakse andmeid ja saadetakse kasutajat tagasi Index vaatesse. Vastasel juhul, ViewData’sse saadetakse ka SelectList’ist valitud õpetaja ID’t, et kuvada taas Create vaadet, aga varem sisestatud andmetega.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("DepartmentId, Name, Budget, StartDate, RawVersion, InstructorID, DepartmentStatus, StudentsDroppedOut, TotalGraduates, Administrator")] Department department)
{
    if (ModelState.IsValid)
    {
        _context.Add(department);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    ViewData["InstructorID"] = new SelectList(_context.Instructors, "Id", "FullName", department.InstructorID);
    // ViewData["CourseStatus"] = new SelectList(_context.Students, "Id", department.CurrentStatus.ToString(), department.CurrentStatus);
    return View(department);
}

Delete GET võtab parameetrina id. Seejärel kontrollib kas id on olemas ning leiab nõutud osakonda andmebaasist koos selle administraatoriga kasutades .Include() ja .FirstOrDefaultAsync meetodeid. Kui osakonda pole olemas siis väljastab see tõrget. Seejärel uuendab ViewData’t “SelectedAction” väärtust “Delete” peale ning tagastab vastava vaade.

[HttpGet]
public async Task<IActionResult> Delete(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var department = await _context.Departments
        .Include(d => d.Administrator)
        .FirstOrDefaultAsync(d => d.DepartmentID == id);

    if (department == null)
    {
        return NotFound();
    }
    ViewData["SelectedAction"] = "Delete";
    return View(department);
}

Delete POST meetod võtab vastu parameetrina osakonda ning koheselt kontrollib kas on vastav osakond olemas andmebaasis kasutades funktsiooni .AnyAsync(). Juhul kui jah, andmebaas eemaldab valitud osakonda kasutades funktsiooni .Remove() ning salvestab andmeid asünkroonselt .SaveChangesAsync(). Seejärel suunab ümber Index vaadesse.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(Department department)
{
    if (await _context.Departments.AnyAsync(m => m.DepartmentID == department.DepartmentID))
    {
        _context.Departments.Remove(department);
        await _context.SaveChangesAsync();
    }
    return RedirectToAction("Index");
}

Details GET võtab vastu parameetrina id. Koheselt kontrollib kas see on olemas ning leiab nõutud osakonda andmebaasist kasutades .FindAsync() funktsiooni. Määrab ViewData’t “SelectedAction” väärtuse “Details” ning tagastab Delete vaadet. (Selles projektis kasutame jagatud vaadet, kus ühel vaadel on kaks funktsiooni, Delete/Details ; Create/Edit).

[HttpGet]
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var department = await _context.Departments.FindAsync(id);
    if (department == null)
    {
        return NotFound();
    }
    ViewData["SelectedAction"] = "Details";
    return View("Delete", department);
}

Edit GET võtab parameetrina id, kontrollib kas see on olemas ning otsib nõutud osakonda andmebaasist kasutades .FindAsync() funktsiooni. Määrab ViewData’t “SelectedAction” väärtuse “Edit” ning kuvab Create vaadet koos sisestatud andmetega. (Selles projektis kasutame jagatud vaadet, kus ühel vaadel on kaks funktsiooni, Delete/Details ; Create/Edit).

[HttpGet]
public async Task<IActionResult> Edit(int? id)
{
    
    if (id == null)
    {
        return NotFound();
    }

    var department = await _context.Departments.FindAsync(id);
    if (department == null)
    {
        return NotFound();
    }
    ViewData["SelectedAction"] = "Edit";
    return View("Create", department);

}

Edit POST võtab vastu parameetrina osakonna andmemudelit ning kontrollib kas see valideerub. Seejärel andmebaas uuendab andmeid vastaval osakonnal kasutades .Update() funktsiooni, salvestab andmeid kasutades .SaveChangesAsync() ning suunab ümber Index vaadesse. Kui valideerimine ebaõnnestub, meetod tagastab Create vaadet viimaste andmetega.

[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ConfirmEdit([Bind("DepartmentID, Name, Budget, StartDate, RawVersion, InstructorID, CurrentStatus, StudentsDroppedOut, TotalGraduates, Administrator")] Department department)
{
    if (department.DepartmentID == null)
    {
        return NotFound();
    }
    if (ModelState.IsValid)
    {
        _context.Departments.Update(department);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    return View("Create", department);
}

CoursesController

Constructor meetod registreerib andmebaasikonteksti

public CoursesController(SchoolContext context)
{
    _context = context;
}

Index meetod laeb sisse kõiki andmebaasis olevaid kursuseid koos nendele kuuluvatega osakondadega kasutades funktsioonde .Include().AsNoTracking() ning muudab neid loendiks kasutades .ToListAsync(). Seejärel meetod kuvab vastavat vaadet koos nende andmetega.

public async Task<IActionResult> Index()
{
    var courses = await _context.Courses.Include(c => c.Department).AsNoTracking().ToListAsync();

    return View(courses);
}

Create GET meetod kutsub välja meetodit PopulateDepartmentDropDownList(), mis laeb sisse andmeid osakondade rippmenüüsse. Seejärel muudab ViewData “SelectedAction” väärtuse “Create” ning kuvab vastava vaadet.

[HttpGet]
public IActionResult Create()
{
    PopulateDepartmentsDropDownList();
    ViewData["SelectedAction"] = "Create";
    return View();
}

Create POST võtab vastu parameetrina kursuse andmemudeli ning koheselt kontrollib kas see valideerub. Juhul kui jah, andmebaas lisab kursust kasutades funktsiooni .Add(). Seejärel suunab ümber kasutajat Index vaatesse.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Course course)
{
    if (ModelState.IsValid)
    {
        _context.Add(course);
        await _context.SaveChangesAsync();
        // PopulateDepartmentsDropDownList(course.DepartmentID);
        
    }

    
    return RedirectToAction("Index");
}

Delete GET võtab parameetrina vastu id ning kontrollib kas see on olemas. Seejärel otsib nõutud kursust koos osakonnaga kursuse id järgi, kasutades funktsioone .Include().AsNoTracking() ja .FirstOrDefaultAsync() – et leida kursust antud id järgi. Seejärel kontrollib kas kursus eksisteerib, muudab ViewData’t ning kuvab vastava vaate.

[HttpGet]
public async Task<IActionResult> Delete(int? id)
{
    if (id == null)
    {
        /* || _context.Courses == null*/
        return NotFound();
    }

    var courses = await _context.Courses
        .Include(c => c.Department)
        .AsNoTracking()
        .FirstOrDefaultAsync(m => m.CourseId == id);

    if (courses == null)
    {
        return NotFound();
    }
    ViewData["SelectedAction"] = "Delete";
    return View(courses);

Delete POST võtab parameetrina id ning kontrollib kas see on olemas, siis leiab nõutud kursuse id järgi andmebaasist kasutades Find.Async() funktsiooni. Seejärel kontrollib kas kursus on olemas ning eemaldab seda andmebaasist kasutades .Remove() funktsiooni, salvestab seda andmebaasi ning tagastab Index vaadesse.

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    if (_context.Courses == null)
    {
        return NotFound();
    }

    var course = await _context.Courses.FindAsync(id);
    if (course != null)
    {
        _context.Courses.Remove(course);
    }
    await _context.SaveChangesAsync();
    
    return RedirectToAction("Index");
}

Details GET

[HttpGet]
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var course = await _context.Courses
        .Include(c => c.Department)
        .AsNoTracking()
        .FirstOrDefaultAsync(m => m.CourseId == id);

    ViewData["SelectedAction"] = "Details";
    return View("Delete", course);
}

Edit GET võtab parameetrina id, kontrollib kas see on olemas, siis leiab nõutud kursust koos kuuluva osakonnaga andmebaasist kasutades .Include() .AsNoTracking() .FirstOrDefaultAsync() funktsioone. Seejärel kutsub PopulateDepartmentsDropDownList(), mis lisab andmeid osakondade rippmenüüsse ning kuvab “Create” vaate koos täidetud andmetega.

public async Task<IActionResult> Edit(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var course = await _context.Courses
        .Include(c => c.Department)
        .AsNoTracking()
        .FirstOrDefaultAsync(m => m.CourseId == id);
    if (course == null)
    {
        return NotFound();
    }

    PopulateDepartmentsDropDownList(course.DepartmentID);
    ViewData["SelectedAction"] = "Edit";
    return View("Create", course);
}

Edit POST võtab kursuse andmemudeli, kontrollib kas see valideerub ning uuendab seda andmebaasis kasutades .Update() funktsiooni, salvestab kasutades .SaveChangesAsync() ning suunab ümber Index vaadesse. Kui valideerimine ebaõnnestub, tagastab “Create” vaatesse koos varem sisestatud andmetega.

[HttpPost, ActionName("Edit")]
[AutoValidateAntiforgeryToken]
public async Task<IActionResult> ConfirmEdit([Bind("CourseId, Title, Credits, DepartmentID")] Course course)
{
    if (course.CourseId == null)
    {
        return NotFound();
    }
    if (ModelState.IsValid)
    {
        _context.Courses.Update(course);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    return View("Create", course);
}

Raadio Ruut FM 96.6 heli clippib, kui kuulata seda veebilehelt

radio.garden

PopulateDepartmentsDropDownList võtab vastu parameetrina valitud osakonda (vaikimisi null-väärtus) ning pärib andmebaasist kõiki osakondi järjestatud tähestikku järekorras nimede järgi. Seejärel tekitab uue rippmenüüvalikute loendi, kuhu lähevad kõik osakonnad, nende ID’d, nimed ja (kui on olemas) ka valitud osakond.

private void PopulateDepartmentsDropDownList(object selectedDepartment = null)
{
    var departmentsQuery = from d in _context.Departments
                           orderby d.Name
                           select d;

    ViewBag.DepartmentID = new SelectList(departmentsQuery.AsNoTracking(), "DepartmentID", "Name", selectedDepartment);
}

DelinquentsController

Constructor meetod registreerib andmebaasikonteksti

public DelinquentsController(SchoolContext context)
{
    _context = context;
}

Index pärib andmebaasist kõki korrarikkujaid ning muudab neid loendiks .ToListAsync(), seejärel kuvab vastava vaade kõkide korrarikkujatega.

public async Task<IActionResult> Index()
{
    var deliquents = await _context.Delinquents.ToListAsync();
    return View(deliquents);
}

Create GET kutsub funktsiooni PopulateViolationDropDownList() , mis kuvab rippmenüüde korrarikkuja-tüüb ja korrarikumine valikuid. Seejärel kuvab vastavat vaadet.

public async Task<IActionResult> Create()
{
    PopulateViolationDropDownList();
    return View();
}

Create POST võtab parameetrina korrarikkuja andmemudeli ning kontrollib kas see valideerub, seejärel lisab korrarikkuja andmebaasisse kasutades .Add() funktsiooni, salvestab andmebaasi kasutades .SaveChangesAsync() funktsiooni ning suunab ümber Index vaadesse.

public async Task<IActionResult> Create(Delinquent delinquent)
{
    if (ModelState.IsValid)
    {
        _context.Add(delinquent);
        await _context.SaveChangesAsync();
    }

    return RedirectToAction("Index");
}

Delete GET võtab parameetrina vastu id, teeb kontrolli, siis leiab nõutud korrarikkuja kasutades funktsioone .AsNoTracking() .FirstOrDefaultAsync(), teeb kontrolli ning kuvab vastavat vaadet koos andmetega.

[HttpGet]
public async Task<IActionResult> Delete(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var delinquent = await _context.Delinquents
        .AsNoTracking()
        .FirstOrDefaultAsync(d => d.DelinquentID == id);

    if (delinquent == null)
    {
        return NotFound();
    }

    return View("Delete", delinquent);
}

Delete POST võtab parameetrina id, teeb kontrolli, siis leiab nõutud korrarikkuja, teeb kontrolli ja eemaldab teda andmebaasist kasutades funktsiooni .Remove(), salvestab muudatusi .SaveChangesAsync() ning suunab ümber Index vaadesse.

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    if (_context.Delinquents == null)
    {
        return NotFound();
    }

    var delinquent = await _context.Delinquents.FindAsync(id);
    if (delinquent != null)
    {
        _context.Delinquents.Remove(delinquent);
    }

    await _context.SaveChangesAsync();
    return RedirectToAction("Index");
}

Details GET võtab vastu id, teeb kontrolli, otsib nõutud korrarikkuja andmebaasist kasutades .AsNoTracking() .FirstOrDefaultAsync() funtksioone, teeb kontrolli ja tagastab vastava vaade koos andmetega.

[HttpGet]
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var delinquent = await _context.Delinquents
        .AsNoTracking().FirstOrDefaultAsync(d => d.DelinquentID == id);

    if (delinquent == null)
    {
        return NotFound();
    }

    return View("Details", delinquent);
}

Edit GET võtab vastu id, teeb kontrolli, siis leiab korrarikkuja andmebaasist, kasutades funktsioone .AsNoTracking() .FirstOrDefaultAsync(), teeb kontrolli. Kutsub välja funktsiooni, mis täidab valikuid rippmenüüdes ning kuvab vastava vaade.

[HttpGet]
public async Task<IActionResult> Edit(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var delinquent = await _context.Delinquents
        .AsNoTracking().FirstOrDefaultAsync(d => d.DelinquentID == id);

    if (delinquent == null)
    {
        return NotFound();
    }

    PopulateViolationDropDownList();
    return View("Edit", delinquent);
}

Edit POST võtab vastu korrarikkuja andmemudelit, kontrollib selle valideerumist. Seejärel uuendab andmed kasutades .Update() funktsiooni, salvestab andmebaasi kasutades .SaveChangesAsync() ning suunab ümber Index vaadesse.

[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ConfirmEdit([Bind("DelinquentID, LastName, FirstName, Violation, DelinquentType, Description")] Delinquent delinquent)
{
    if (delinquent.DelinquentID == null)
    {
        return NotFound();
    }
    if (ModelState.IsValid)
    {
        _context.Delinquents.Update(delinquent);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    return View("Edit", delinquent);
}

PopulateViolationDropDownList, tekitab Array kõikide korrarikkumiste väärtustega ning lisab neid rippmenüüvalikute loendisse. Siis teeb samad asja korrarikkujatüüpidega. Lõpus lisab mõlemad ViewBag’isse, mida saab kasutada hiljem vaadetes.

private void PopulateViolationDropDownList()
{
    Array enumList = Enum.GetValues(typeof(Violation));
    List<Violation> newSelectList = new List<Violation>();
    foreach (Violation getViolation in enumList)
    {
        newSelectList.Add(getViolation);
    }

    enumList = Enum.GetValues(typeof(DelinquentType));
    List<DelinquentType> delinquentTypes = new List<DelinquentType>();

    foreach (DelinquentType getDelinquentType in enumList)
    {
        delinquentTypes.Add(getDelinquentType);
    }

    ViewBag.ViolationList = new SelectList(newSelectList);
    ViewBag.DelinquentTypes = new SelectList(delinquentTypes);
}

Andmetabelid

Tabel Õpilane

 public class Student
 {
     public int Id { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
     public DateTime EnrollmentDate { get; set; }
     public ICollection<Enrollment>? Enrollments { get; set; }

     /* Lisa kolm omadust */

     public int? Smart { get; set; }
     public int? Sleepy { get; set; }
     public ICollection<Track>? Tracks { get; set; }
 }

Tabel Õpetaja

public class Instructor
{
    [Key]
    public int ID { get; set; }
    [Required]
    [StringLength(50)]
    [Display(Name = "Perekonnanimi")]
    public string LastName { get; set; }
    [Required]
    [StringLength(50)]
    [Display(Name = "Eesnimi")]
    public string FirstName { get; set; }
    /*  */
    [Display(Name = "Õpetaja nimi")]
    public string FullName
    {
        get { return LastName + ", " + FirstName; }
    }
    /*  */
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
    [Display(Name = "Tööleasumiskuupäev")]
    public DateTime HireDate { get; set; }

    public enum Status
    {
        Employed,
        SickLeave,
        ParentalLeave,
        Fired
    }

    public Status? status { get; set; }
    public ICollection<CourseAssignment>? CourseAssignments { get; set; }
    public OfficeAssignment? OfficeAssignments { get; set; }
    /* Lisa kolm omadust õpetaja, ise nõtled välja*/
    [Display(Name = "Telefoni number")]
    public string? PhoneNumber { get; set; }
    [Display(Name = "Alkohoolik")]
    public int? Alcoholic { get; set; }
    [Display(Name = "Vangis olnud")]
    public int? BeenInJail { get; set; }
}

Tabel Osakond

public class Department
{
    [Key]
    public int DepartmentID { get; set; }
    public string Name { get; set; }
    public decimal Budget { get; set; }
    public DateTime StartDate { get; set; }
    
    public int? InstructorID { get; set; }
    public Instructor? Administrator { get; set; }
    public ICollection<Course>? Courses { get; set; }
    public byte? RawVersion { get; set; }
    /* 3 isiklikult unikaalset andmevälja kursusele juurde */

    public DepartmentStatus? CurrentStatus { get; set; }
    public int? StudentsDroppedOut { get; set; }
    public int? TotalGraduates { get; set; }


}

Tabel Kursus

public class Course
 {
     [Key]
     public int CourseId { get; set; }
     public string Title { get; set; }
     public int Credits { get; set; }
     public Department? Department { get; set; }
     public int? DepartmentID { get; set; }
     public ICollection<Enrollment>? Enrollments { get; set; }
     public ICollection<CourseAssignment>? CourseAssignments { get; set; }


 }

Tabel Korrarikkuja koos vastavate Enum’itega

public enum Violation
{
    DrugRecreation,
    DrugTrafficking,
    Assault,
    SexualAssault,
    HateCrimeInstigation,
    Arson,
    ThrowingFood,
    Misdismeanor,
    Vandalism
}

public enum DelinquentType
{
    Student,
    Instructor
}

public class Delinquent
{
    [Key]
    public int DelinquentID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public Violation Violation { get; set; }
    public DelinquentType DelinquentType { get; set; }
    public string? Description { get; set; }

}

LINQ

Select() – Tagastab IEnumerable, mis koosnevad valitud väljadest

FindAsync() – Otsib objekti antud tingimuse põhjal

FirstOrDefaultAsync() – Tagastab esimese elemendi loendist

Include() – Annab teada, mis andmetabeleid on vaja juurde pärida mingi objekti jaoks

ToListAsync() – Muudab loendiks

SingleAsync() – Võtab ühe elemendi loendist antud tingimuse põhjal

Add() – Lisab objekti andmebaasisse

Update() – Uuendab objekti andmebaasis

Remove() – Kustutab objekti andmebaasist

SaveChangesAsync() – Salvestab andmebaasi