Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Tom Dykstra
Contoso University örnek web uygulaması, Entity Framework 4.0 ve Visual Studio 2010 kullanarak ASP.NET Web Forms uygulamaları oluşturmayı gösterir. Öğretici serisi hakkında bilgi için serideki ilk öğreticiye bakın
İlgili Verilerle Çalışma, Devam
Önceki öğreticide, ilgili verilerle çalışmak için denetimi kullanmaya EntityDataSource
başladınız. Gezinti özelliklerinde birden çok hiyerarşi düzeyi görüntülediyseniz ve verileri düzenlediniz. Bu öğreticide, ilişkileri ekleyip silerek ve var olan bir varlıkla ilişkisi olan yeni bir varlık ekleyerek ilgili verilerle çalışmaya devam edersiniz.
Departmanlara atanan kursları ekleyen bir sayfa oluşturacaksınız. Bölümler zaten var ve yeni bir kurs oluşturduğunuzda, aynı zamanda bu bölümle mevcut bir bölüm arasında bir ilişki kuracaksınız.
Ayrıca bir kursa eğitmen atayarak (seçtiğiniz iki varlık arasında ilişki ekleyerek) veya bir kurstan bir eğitmeni kaldırarak (seçtiğiniz iki varlık arasındaki ilişkiyi kaldırarak) çoka çok ilişkisiyle çalışan bir sayfa oluşturacaksınız. Veritabanında, eğitmen ile kurs arasında ilişki eklemek ilişkilendirme tablosuna yeni bir satır eklenmesiyle CourseInstructor
sonuçlanıyor; ilişkiyi kaldırmak için ilişkilendirme tablosundan bir satırın CourseInstructor
silinmesi gerekir. Ancak, bunu Entity Framework'te tabloya açıkça başvurmadan CourseInstructor
gezinti özelliklerini ayarlayarak yaparsınız.
Var Olan Varlığa İlişkili Varlık Ekleme
Site.Master ana sayfasını kullanan CoursesAdd.aspx adlı yeni bir web sayfası oluşturun ve adlı Content2
denetime aşağıdaki işaretlemeyi Content
ekleyin:
<h2>Add Courses</h2>
<asp:EntityDataSource ID="CoursesEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
EntitySetName="Courses"
EnableInsert="True" EnableDelete="True" >
</asp:EntityDataSource>
<asp:DetailsView ID="CoursesDetailsView" runat="server" AutoGenerateRows="False"
DataSourceID="CoursesEntityDataSource" DataKeyNames="CourseID"
DefaultMode="Insert" oniteminserting="CoursesDetailsView_ItemInserting">
<Fields>
<asp:BoundField DataField="CourseID" HeaderText="ID" />
<asp:BoundField DataField="Title" HeaderText="Title" />
<asp:BoundField DataField="Credits" HeaderText="Credits" />
<asp:TemplateField HeaderText="Department">
<InsertItemTemplate>
<asp:EntityDataSource ID="DepartmentsEntityDataSource" runat="server" ConnectionString="name=SchoolEntities"
DefaultContainerName="SchoolEntities" EnableDelete="True" EnableFlattening="False"
EntitySetName="Departments" EntityTypeFilter="Department">
</asp:EntityDataSource>
<asp:DropDownList ID="DepartmentsDropDownList" runat="server" DataSourceID="DepartmentsEntityDataSource"
DataTextField="Name" DataValueField="DepartmentID"
oninit="DepartmentsDropDownList_Init">
</asp:DropDownList>
</InsertItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowInsertButton="True" />
</Fields>
</asp:DetailsView>
Bu işaretleme, kursları seçen, eklemeye olanak tanıyan ve olay için Inserting
bir işleyici belirten bir denetim oluştururEntityDataSource
. Yeni Course
bir varlık oluşturulduğunda gezinti özelliğini güncelleştirmek Department
için işleyicisini kullanacaksınız.
İşaretlemeyi ayrıca yeni Course
varlıklar eklemek için kullanılacak bir DetailsView
denetim oluşturur. İşaretlem, varlık özellikleri için Course
ilişkili alanları kullanır. Bu sistem tarafından oluşturulan bir kimlik alanı olmadığından değeri girmeniz CourseID
gerekir. Bunun yerine, kurs oluşturulduğunda el ile belirtilmesi gereken bir ders numarasıdır.
Gezinti özellikleri denetimlerle BoundField
kullanılamadığından, gezinti özelliği için Department
bir şablon alanı kullanırsınız. Şablon alanı, departmanı seçmek için bir açılan liste sağlar. Açılan liste, gezinti özelliklerini güncelleştirmek için Departments
doğrudan bağlayamadığınızdan, yeniden yerine kullanılarak Eval
Bind
ayarlanan varlığa bağlıdır. Denetimin DropDownList
Init
olayı için bir işleyici belirtirsiniz, böylece yabancı anahtarı güncelleştiren DepartmentID
kod tarafından kullanılmak üzere denetime bir başvuru depolayabilirsiniz.
CoursesAdd.aspx.cs dosyasında, kısmi sınıf bildiriminden hemen sonra, denetime başvuruyu tutmak için DepartmentsDropDownList
bir sınıf alanı ekleyin:
private DropDownList departmentDropDownList;
Denetimin DepartmentsDropDownList
olayı için bir işleyici ekleyin, böylece denetime Init
bir başvuru depolayabilirsiniz. Bu, kullanıcının girdiği değeri almanıza ve varlığın DepartmentID
değerini güncelleştirmek için kullanmanıza Course
olanak tanır.
protected void DepartmentsDropDownList_Init(object sender, EventArgs e)
{
departmentDropDownList = sender as DropDownList;
}
Denetimin DetailsView
Inserting
olayı için bir işleyici ekleyin:
protected void CoursesDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
var departmentID = Convert.ToInt32(departmentDropDownList.SelectedValue);
e.Values["DepartmentID"] = departmentID;
}
Kullanıcı öğesine tıkladığındaInsert
Inserting
, olay yeni kayıt eklenmeden önce oluşturulur. İşleyicideki kod, denetiminden öğesini alır DepartmentID
ve varlığın özelliği Course
için kullanılacak değeri ayarlamak için DepartmentID
bunu DropDownList
kullanır.
Entity Framework, bu kursu ilişkili Department
varlığın Courses
gezinti özelliğine ekleme işlemini üstlenir. Ayrıca, departmanı varlığın Department
gezinti özelliğine Course
ekler.
Sayfayı çalıştırın.
Bir kimlik, başlık, bir dizi kredi girin, bir departman seçin ve ekle'ye tıklayın.
Courses.aspx sayfasını çalıştırın ve yeni kursu görmek için aynı bölümü seçin.
Çoka Çok İlişkilerle Çalışma
Varlık kümesi ile People
varlık kümesi arasındaki Courses
ilişki çoka çok ilişkidir. Varlıkta Course
sıfır, bir veya daha fazla ilgili Person
varlık (bu kursu öğretmek için atanan eğitmenleri temsil eder) içerebilen adlı People
bir gezinti özelliği vardır.
Person
Varlıkta sıfır, bir veya daha fazla ilgili Course
varlık (eğitmenin öğretmeye atandığı kursları temsil eder) içerebilen adlı Courses
bir gezinti özelliği vardır. Bir eğitmen birden çok ders verebilir ve bir ders birden çok eğitmen tarafından öğretilebilir. İzlenecek kılavuzun bu bölümünde, ilgili varlıkların gezinti özelliklerini güncelleştirerek ve Course
varlıkları arasındaki Person
ilişkileri ekleyip kaldıracaksınız.
Site.Master ana sayfasını kullanan InstructorsCourses.aspx adlı yeni bir web sayfası oluşturun ve adlı Content2
denetime aşağıdaki işaretlemeyi Content
ekleyin:
<h2>Assign Instructors to Courses or Remove from Courses</h2>
<br />
<asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
EntitySetName="People"
Where="it.HireDate is not null" Select="it.LastName + ', ' + it.FirstMidName AS Name, it.PersonID">
</asp:EntityDataSource>
Select an Instructor:
<asp:DropDownList ID="InstructorsDropDownList" runat="server" DataSourceID="InstructorsEntityDataSource"
AutoPostBack="true" DataTextField="Name" DataValueField="PersonID"
OnSelectedIndexChanged="InstructorsDropDownList_SelectedIndexChanged"
OnDataBound="InstructorsDropDownList_DataBound">
</asp:DropDownList>
<h3>
Assign a Course</h3>
<br />
Select a Course:
<asp:DropDownList ID="UnassignedCoursesDropDownList" runat="server"
DataTextField="Title" DataValueField="CourseID">
</asp:DropDownList>
<br />
<asp:Button ID="AssignCourseButton" runat="server" Text="Assign" OnClick="AssignCourseButton_Click" />
<br />
<asp:Label ID="CourseAssignedLabel" runat="server" Visible="false" Text="Assignment successful"></asp:Label>
<br />
<h3>
Remove a Course</h3>
<br />
Select a Course:
<asp:DropDownList ID="AssignedCoursesDropDownList" runat="server"
DataTextField="title" DataValueField="courseiD">
</asp:DropDownList>
<br />
<asp:Button ID="RemoveCourseButton" runat="server" Text="Remove" OnClick="RemoveCourseButton_Click" />
<br />
<asp:Label ID="CourseRemovedLabel" runat="server" Visible="false" Text="Removal successful"></asp:Label>
Bu işaretleme, eğitmenler için varlıkların adını ve PersonID
Person
adını alan bir EntityDataSource
denetim oluşturur. Denetim DropDrownList
, denetime EntityDataSource
bağlıdır. Denetim, DropDownList
olay için DataBound
bir işleyici belirtir. Kursları görüntüleyen iki açılan listeyi veri bağlamak için bu işleyiciyi kullanacaksınız.
İşaretleme, seçilen eğitmene bir kurs atamak için kullanılacak aşağıdaki denetim grubunu da oluşturur:
-
DropDownList
Atanacak kursu seçme denetimi. Bu denetim, seçili eğitmene şu anda atanmamış kurslarla doldurulur. -
Button
Atamayı başlatmak için bir denetim. -
Label
Atama başarısız olursa hata iletisi görüntüleme denetimi.
Son olarak, işaretleme seçilen eğitmenden bir kursu kaldırmak için kullanılacak bir denetim grubu da oluşturur.
InstructorsCourses.aspx.cs dosyasına bir using deyimi ekleyin:
using ContosoUniversity.DAL;
Kursları görüntüleyen iki açılan listeyi doldurma yöntemi ekleyin:
private void PopulateDropDownLists()
{
using (var context = new SchoolEntities())
{
var allCourses = (from c in context.Courses
select c).ToList();
var instructorID = Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People.Include("Courses")
where p.PersonID == instructorID
select p).First();
var assignedCourses = instructor.Courses.ToList();
var unassignedCourses = allCourses.Except(assignedCourses.AsEnumerable()).ToList();
UnassignedCoursesDropDownList.DataSource = unassignedCourses;
UnassignedCoursesDropDownList.DataBind();
UnassignedCoursesDropDownList.Visible = true;
AssignedCoursesDropDownList.DataSource = assignedCourses;
AssignedCoursesDropDownList.DataBind();
AssignedCoursesDropDownList.Visible = true;
}
}
Bu kod, varlık kümesindeki Courses
tüm kursları alır ve seçilen eğitmen için varlığın Person
gezinti özelliğinden Courses
kursları alır. Ardından bu eğitmene hangi derslerin atandığını belirler ve açılan listeleri buna göre doldurur.
Düğmenin Assign
Click
olayı için bir işleyici ekleyin:
protected void AssignCourseButton_Click(object sender, EventArgs e)
{
using (var context = new SchoolEntities())
{
var instructorID = Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People
where p.PersonID == instructorID
select p).First();
var courseID = Convert.ToInt32(UnassignedCoursesDropDownList.SelectedValue);
var course = (from c in context.Courses
where c.CourseID == courseID
select c).First();
instructor.Courses.Add(course);
try
{
context.SaveChanges();
PopulateDropDownLists();
CourseAssignedLabel.Text = "Assignment successful.";
}
catch (Exception)
{
CourseAssignedLabel.Text = "Assignment unsuccessful.";
//Add code to log the error.
}
CourseAssignedLabel.Visible = true;
}
}
Bu kod seçilen eğitmenin Person
varlığını alır, seçilen kursun Course
varlığını alır ve seçilen kursu eğitmenin Person
varlığının gezinti özelliğine Courses
ekler. Ardından değişiklikleri veritabanına kaydeder ve sonuçların hemen görülebilmesi için açılan listeleri yeniden doldurulur.
Düğmenin Remove
Click
olayı için bir işleyici ekleyin:
protected void RemoveCourseButton_Click(object sender, EventArgs e)
{
using (var context = new SchoolEntities())
{
var instructorID = Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People
where p.PersonID == instructorID
select p).First();
var courseID = Convert.ToInt32(AssignedCoursesDropDownList.SelectedValue);
var courses = instructor.Courses;
var courseToRemove = new Course();
foreach (Course c in courses)
{
if (c.CourseID == courseID)
{
courseToRemove = c;
break;
}
}
try
{
courses.Remove(courseToRemove);
context.SaveChanges();
PopulateDropDownLists();
CourseRemovedLabel.Text = "Removal successful.";
}
catch (Exception)
{
CourseRemovedLabel.Text = "Removal unsuccessful.";
//Add code to log the error.
}
CourseRemovedLabel.Visible = true;
}
}
Bu kod seçilen eğitmenin Person
varlığını alır, seçilen kursun Course
varlığını alır ve seçilen kursu varlığın Person
Courses
gezinti özelliğinden kaldırır. Ardından değişiklikleri veritabanına kaydeder ve sonuçların hemen görülebilmesi için açılan listeleri yeniden doldurulur.
Raporlama hatası olmadığında hata iletilerinin görünür olmadığından emin olmak için yöntemine Page_Load
kod ekleyin ve kurs açılan listelerini doldurmak için eğitmenler açılan listesinin ve SelectedIndexChanged
olayları için DataBound
işleyiciler ekleyin:
protected void Page_Load(object sender, EventArgs e)
{
CourseAssignedLabel.Visible = false;
CourseRemovedLabel.Visible = false;
}
protected void InstructorsDropDownList_DataBound(object sender, EventArgs e)
{
PopulateDropDownLists();
}
protected void InstructorsDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
PopulateDropDownLists();
}
Sayfayı çalıştırın.
Bir eğitmen seçin. Kurs Ata açılan listesinde eğitmenin öğretmediği kurslar görüntülenir ve Kursu Kaldır açılan listesinde eğitmenin zaten atanmış olduğu kurslar görüntülenir. Kurs Ata bölümünde bir kurs seçin ve ata'ya tıklayın. Kurs, Kursu Kaldır açılan listesine geçer. Kursu Kaldır bölümünden bir kurs seçin ve Kaldır'a tıklayın. Kurs, Kurs Ata açılan listesine geçer.
Artık ilgili verilerle çalışmanın başka yollarını da gördünüz. Aşağıdaki öğreticide, uygulamanızın sürdürülebilirliğini geliştirmek için veri modelinde devralmayı kullanmayı öğreneceksiniz.