方法 : 継承階層を割り当てる (LINQ to SQL)
LINQ で継承の割り当てを実装するには、以下の手順で示すように、継承階層のルート クラスで属性および属性プロパティを指定する必要があります。 Visual Studio を使用している開発者は、オブジェクト リレーショナル デザイナーを使用して継承階層を割り当てることができます。
メモ |
---|
サブクラスには特別な属性やプロパティは必要ありません。特に、サブクラスに TableAttribute 属性がない点に注意してください。 |
継承階層を割り当てるには
ルート クラスに TableAttribute 属性を追加します。
ルート クラスに対し、階層構造の各クラスについて InheritanceMappingAttribute 属性を追加します。
各 InheritanceMappingAttribute 属性に対し、Code プロパティを定義します。
このプロパティは、データベース テーブルの IsDiscriminator 列に含まれる値を保持し、このデータ行が属するクラスまたはサブクラスを示します。
各 InheritanceMappingAttribute 属性に対し、Type プロパティも追加します。
このプロパティは、キー値が示すクラスまたはサブクラスを表す値を保持します。
1 つの InheritanceMappingAttribute 属性にのみ、IsDefault プロパティを追加します。
このプロパティは、データベース テーブルから取得された識別値が、継承の割り当てのいずれの Code 値にも一致しない場合に使用する、フォールバック用の割り当てを示します。
ColumnAttribute 属性に IsDiscriminator プロパティを追加します。
このプロパティは、Code 値を保持する列であることを示します。
使用例
メモ |
---|
Visual Studio を使用している場合は、オブジェクト リレーショナル デザイナーを使用して継承を構成できます。 |
次のコード例では、Vehicle をルート クラスとして定義し、ここまでの手順を実装して、LINQ の階層構造を指定します。 このリレーションシップを次の図に示します。
<Table()> _
<InheritanceMapping(Code:="C", Type:=GetType(Car))> _
<InheritanceMapping(Code:="T", Type:=GetType(Truck))> _
<InheritanceMapping(Code:="V", Type:=GetType(Vehicle), _
IsDefault:=True)> _
Public Class Vehicle
<Column(IsDiscriminator:=True)> _
Private DiscKey As String
<Column(IsPrimaryKey:=True)> _
Private VIN As String
<Column()> _
Private MfgPlant As String
End Class
Public Class Car
Inherits Vehicle
<Column()> _
Private TrimCode As Integer
<Column()> _
Private ModelName As String
End Class
Public Class Truck
Inherits Vehicle
<Column()> _
Private Tonnage As Integer
<Column()> _
Private Axles As Integer
End Class
[Table]
[InheritanceMapping(Code = "C", Type = typeof(Car))]
[InheritanceMapping(Code = "T", Type = typeof(Truck))]
[InheritanceMapping(Code = "V", Type = typeof(Vehicle),
IsDefault = true)]
public class Vehicle
{
[Column(IsDiscriminator = true)]
public string DiscKey;
[Column(IsPrimaryKey = true)]
public string VIN;
[Column]
public string MfgPlant;
}
public class Car : Vehicle
{
[Column]
public int TrimCode;
[Column]
public string ModelName;
}
public class Truck : Vehicle
{
[Column]
public int Tonnage;
[Column]
public int Axles;
}