Aracılığıyla paylaş


Entity Framework 4.0 Database First ve ASP.NET 4 Web Forms Ile Çalışmaya Başlama - 5. Bölüm

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

Ö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.

Kimlik, Başlık ve Kredi metin alanları ve Bölüm açılan menüsü ile Kurs Ekle görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

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.

Kurslara Eğitmen Ata veya Kurslardan Kaldır görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

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ı Content2denetime 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 EvalBindayarlanan varlığa bağlıdır. Denetimin DropDownListInit 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 DetailsViewInserting 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ığındaInsertInserting, 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.

Kimlik, Başlık ve Kredi metin alanları ve Bölüm açılan menüsüyle Kurs Ekle görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

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.

Resim03

Ç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ı Content2denetime 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 PersonIDPerson 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 AssignClick 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 RemoveClick 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 PersonCourses 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.

İlgili açılan menüleri içeren Kurslara Eğitmen Atama veya Kurslardan Kaldır görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

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.