1

Table-Per-Type 階層を使用する現在の設計が、次のことを行うための最良の方法であるかどうかを判断しようとしています。

たとえば、3 つの子クラス (Manager、Executive、Employee) があり、それらはすべて基本 Person から継承されます。次に、グリッド ビュー内に Person のすべてのインスタンスを表示して、エンド ユーザーが関連データを選択して編集できるようにします。ただし、私の質問は、 Person が選択されたときに適切なタイプを照会する方法に関するものです。私が現在行っているのは、 Person クラスの次のようなものです。

public class Person 
{
    Guid PersonID { get; set; }    
    string FirstName { get; set; } 
    string LastName { get; set; }   
    string PersonType { get; set; } 
}

次にPersonType、子クラスがインスタンス化されるときに、各子クラスにフィールドを設定します。

バインドを設定し、デリゲートをSelectionChangedイベントに接続する

BindingSource peopleBinding = new BindingSource();  
peopleBinding.DataSource = db.People.Local.ToBindingList();
this.peopleGridView.DataSource = peopleBinding;    
this.peopleGridView.SelectionChanged += new EventHandler(peopleGridView_SelectionChanged);

GridView の SelectionChanged イベント

if (peopleGridView.SelectedRows.Count != 1) 
{
     return;
}

Person person = peopleBinding.Current as Person;
if (person == null) 
{ 
     return;
}

switch (person.PersonType) 
{
    case "Employee":         
       Employee employee = db.Employees.Find(person.PersonID);
       // Do Work With Employee
       break;
    case "Manager":
       Manager manager = db.Managers.Find(person.PersonID);
       // Do Work With Manager
       break;
    case "Executive":
       Executive executive = db.Executives.Find(person.PersonID);
       // Do Work With Executive
       break;
    default: 
       throw new ArgumentException (string.Format("Invalid type of person encountered ({0})", person.PersonType);
}

関連するエンティティを取得するためにクエリする必要があるPersonTypeものを決定する際に、フィールドをある種の識別子として使用するのではなく、子クラスのインスタンスを取得するより良い方法はありますか?DbSet

4

2 に答える 2

2

isキーワードを使用できます。

if (person is Employee)
  ...
else if (person is Manager)
  ...
else if (person is Executive)
  ...
于 2013-01-16T17:12:15.110 に答える
0

(たとえば)持っている場合はDbSet<Person>、それに対して `OfType<> を呼び出すだけです。何かのようなもの:

Person person = db.People.OfType<Manager>().Find(PersonID);

編集: TPTソリューションでは、これにより、PersonType Discriminatorを他の場所で必要としないと仮定して、保存する必要もなくなります。

于 2013-01-16T17:28:23.370 に答える