방법: 파생 형식에 컨트롤 바인딩(Entity Framework)
Entity Framework 를 사용하면 ComboBox 또는 DataGridView와 같은 Windows Forms 컨트롤을 EntityCollection에 바인딩할 수 있습니다. 그러나 EntityCollection에서 OfType 메서드를 실행하여 파생 형식의 개체 컬렉션을 반환하는 경우 반환된 IEnumerable을 직접 컨트롤에 바인딩할 수 없습니다. 이 항목의 예제에서는 CreateSourceQuery 메서드를 사용하여 EntityCollection을 정의하는 ObjectQuery를 만드는 방법을 보여 줍니다. 이 쿼리가 OfType 메서드로 실행되어 특정 하위 형식에 대한 바인딩을 수행합니다. 자세한 내용은 컨트롤에 개체 바인딩(Entity Framework)을 참조하십시오.
이 항목의 예제는 School 모델의 수정된 버전을 기반으로 합니다. 이 버전에서는 추상 형식이 Course인 형식당 하나의 테이블 상속을 지원합니다. 매핑 상속 - 형식당 하나의 테이블 연습을 완료하여 이 항목에서 사용되는 형식당 하나의 테이블 상속 예제를 지원하도록 School 모델을 수정합니다.
예제
다음 예제는 Windows Form에서 가져온 것입니다. 폼이 로드되면 ObjectQuery의 Execute 메서드를 호출하여 Department 개체의 ObjectResult가 반환됩니다. 이 결과는 콤보 상자에 바인딩됩니다. 주문을 선택하면 Course 개체의 관련 EntityCollection에서 CreateSourceQuery 메서드가 호출됩니다. 반환된 ObjectQuery는 OfType 메서드를 통해 실행되고 결과는 DataGridView 컨트롤에 바인딩됩니다. OfType 메서드에 사용되는 형식은 폼에 있는 라디오 상자 설정을 기반으로 설정됩니다.
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
namespace Microsoft.Samples.Edm
{
public partial class SchoolForm : Form
{
private SchoolEntities context;
private bool isOnlineCourse = false;
public SchoolForm()
{
// Initializes the designer-generated controls.
InitializeComponent();
if (isOnlineCourse) radioButtonOnline.Checked = true;
else radioButtonOnsite.Checked = true;
}
private void SchoolForm_Load(object sender, EventArgs e)
{
// Initialize the object context.
try
{
context = new SchoolEntities();
// Create a query for all departments.
ObjectQuery<Department> departmentQuery =
context.Departments;
// Display the department name in the combo box.
this.comboBoxDepartment.DisplayMember = "Name";
// Bind the combo box to the ObjectResult of the departments
// that are returned when the query is executed.
this.comboBoxDepartment.DataSource =
departmentQuery.Execute(MergeOption.AppendOnly);
}
catch (EntitySqlException ex)
{
MessageBox.Show(ex.Message);
}
}
private void BindToCourseByType()
{
// Get the currently selected Department object.
Department selectedDepartment =
(Department)this.comboBoxDepartment.SelectedItem;
try
{
if (isOnlineCourse)
{
// Bind the data grid to the result of the execution of the ObjectQuery
// that returns only the online courses for the selected department.
dataGridViewCourses.DataSource =
selectedDepartment.Courses.CreateSourceQuery()
.OfType<OnlineCourse>().Execute(MergeOption.AppendOnly);
}
else
{
// Bind the data grid to the result of the execution of the ObjectQuery
// that returns only the on-site courses for the selected department.
dataGridViewCourses.DataSource =
selectedDepartment.Courses.CreateSourceQuery()
.OfType<OnsiteCourse>().Execute(MergeOption.AppendOnly);
}
// Hide the columns bound to navigation properties.
dataGridViewCourses.Columns["Department"].Visible = false;
dataGridViewCourses.Columns["StudentGrades"].Visible = false;
dataGridViewCourses.Columns["People"].Visible = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void departmentComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
this.BindToCourseByType();
}
private void onlineRadio_CheckedChanged(object sender, EventArgs e)
{
if (this.radioButtonOnline.Checked)
{
isOnlineCourse = true;
this.BindToCourseByType();
}
else
{
isOnlineCourse = false;
this.BindToCourseByType();
}
}
private void Close_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
참고 항목
작업
방법: Windows Presentation Foundation 컨트롤에 개체 바인딩(Entity Framework)
방법: Windows Form 컨트롤에 개체 바인딩(Entity Framework)