Практическое руководство. Сопоставление иерархий наследования
Чтобы реализовать сопоставление наследования в LINQ, необходимо указать атрибуты и свойства атрибутов корневого класса иерархии наследования, как описано в следующих шагах. Разработчики, использующие Visual Studio, могут использовать реляционный конструктор объектов для сопоставления иерархий наследования. Узнайте , как настроить наследование с помощью конструктора O/R.
Примечание.
Особые атрибуты или свойства подклассов не требуются. Обратите особое внимание на то, что подклассы не имеют атрибута TableAttribute.
Сопоставление иерархий наследования
Добавьте к корневому классу атрибут TableAttribute.
Кроме того, в корневом классе необходимо добавить атрибут InheritanceMappingAttribute для каждого класса в структуре иерархии.
Определите свойство InheritanceMappingAttribute для каждого атрибута Code.
Это свойство содержит значение, которое отображается в столбце IsDiscriminator таблицы базы данных и указывает, к какому классу или подклассу принадлежит эта строка данных.
Добавьте также для каждого атрибута InheritanceMappingAttribute свойство Type.
Данное свойство содержит значение, которое указывает, на какой класс или подкласс указывает значение ключа.
Добавьте свойство InheritanceMappingAttribute только к одному атрибуту IsDefault.
Это свойство служит для обозначения резервного сопоставления, если дискриминационное значение из таблицы базы данных не соответствует ни одному Code значению в сопоставлениях наследования.
Добавьте свойство IsDiscriminator к атрибуту ColumnAttribute.
Это свойство означает, что данный столбец содержит значение Code.
Пример
Примечание.
При использовании Visual Studio можно использовать реляционный конструктор объектов для настройки наследования. Практическое руководство . Настройка наследования с помощью конструктора O/R
В следующем примере Vehicle
кода определяется как корневой класс, а предыдущие шаги реализованы для описания иерархии для LINQ.
[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;
}
<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