Поделиться через


Объектная модель LINQ to SQL

В LINQ to SQL объектная модель, выраженная на языке программирования разработчика, сопоставляется с моделью данных реляционной базы данных. Затем операции с данными выполняются в соответствии с объектной моделью.

В этом сценарии команды базы данных (например, INSERT) не выдаются в базу данных. Вместо этого вы изменяете значения и выполняете методы в объектной модели. Если вы хотите запросить базу данных или отправить изменения, LINQ to SQL преобразует запросы в правильные команды SQL и отправляет эти команды в базу данных.

Снимок экрана: объектная модель Linq.

Наиболее фундаментальные элементы объектной модели LINQ to SQL и их связь с элементами в реляционной модели данных приведены в следующей таблице:

Объектная модель LINQ to SQL Реляционная модель данных
Класс сущности Таблица
Член класса колонна
Ассоциация Связь внешнего ключа
Метод Хранимая процедура или функция

Замечание

В следующих описаниях предполагается, что у вас есть базовые знания о модели реляционных данных и правилах.

Классы сущностей и таблицы баз данных LINQ to SQL

В LINQ to SQL таблица базы данных представлена классом сущностей. Класс сущности похож на любой другой класс, который можно создать, за исключением того, что вы аннотируете класс специальной информацией, связывающей его с таблицей базы данных. Чтобы сделать эту заметку, добавьте настраиваемый атрибут (TableAttribute) в объявление класса, как показано в следующем примере:

Пример

[Table(Name = "Customers")]
public class Customerzz
{
    public string CustomerID;
    // ...
    public string City;
}
<Table(Name:="Customers")> _
Public Class Customer
    Public CustomerID As String
    ' ...
    Public City As String
End Class

В базу данных можно сохранить только экземпляры классов, объявленных как таблицы (т. е. классы сущностей).

Дополнительные сведения см. в разделе «Атрибуты таблицы» Attribute-Based Mapping.

Элементы класса LINQ to SQL и столбцы базы данных

Помимо связывания классов с таблицами, вы назначаете поля или свойства для представления столбцов базы данных. Для этого LINQ to SQL определяет ColumnAttribute атрибут, как показано в следующем примере:

Пример

[Table(Name = "Customers")]
public class Customer
{
    [Column(IsPrimaryKey = true)]
    public string CustomerID;
    [Column]
    public string City;
}
<Table(Name:="Customers")> _
Public Class Customer
    <Column(IsPrimaryKey:=True)> _
    Public CustomerID As String

    <Column()> _
    Public City As String
End Class

Только поля и свойства, сопоставленные со столбцами, сохраняются или извлекаются из базы данных. Не объявленные как столбцы считаются временными частями логики приложения.

Атрибут ColumnAttribute имеет множество свойств, которые можно использовать для настройки этих элементов, представляющих столбцы (например, обозначая элемент как представляющий столбец первичного ключа). Дополнительные сведения можно найти в разделе "Атрибуты столбца" Attribute-Based сопоставления.

Ассоциации LINQ to SQL и взаимосвязи внешнего ключа базы данных

В LINQ to SQL вы представляете связи баз данных (например, внешний ключ к связям первичного ключа), применяя AssociationAttribute атрибут. В следующем сегменте кода класс Order содержит свойство Customer и имеет атрибут AssociationAttribute. Это свойство и его атрибут предоставляют Order классу связь с классом Customer .

В следующем примере кода показано свойство Customer класса Order.

Пример

[Association(Name="FK_Orders_Customers", Storage="_Customer", ThisKey="CustomerID", IsForeignKey=true)]
public Customer Customer
{
    get
    {
        return this._Customer.Entity;
    }
    set
    {
        Customer previousValue = this._Customer.Entity;
        if (((previousValue != value)
                    || (this._Customer.HasLoadedOrAssignedValue == false)))
        {
            this.SendPropertyChanging();
            if ((previousValue != null))
            {
                this._Customer.Entity = null;
                previousValue.Orders.Remove(this);
            }
            this._Customer.Entity = value;
            if ((value != null))
            {
                value.Orders.Add(this);
                this._CustomerID = value.CustomerID;
            }
            else
            {
                this._CustomerID = default(string);
            }
            this.SendPropertyChanged("Customer");
        }
    }
}
<Association(Name:="FK_Orders_Customers", Storage:="_Customer", ThisKey:="CustomerID", IsForeignKey:=true)>  _
Public Property Customer() As Customer
    Get
        Return Me._Customer.Entity
    End Get
    Set
        Dim previousValue As Customer = Me._Customer.Entity
        If (((previousValue Is value)  _
                    = false)  _
                    OrElse (Me._Customer.HasLoadedOrAssignedValue = false)) Then
            Me.SendPropertyChanging
            If ((previousValue Is Nothing)  _
                        = false) Then
                Me._Customer.Entity = Nothing
                previousValue.Orders.Remove(Me)
            End If
            Me._Customer.Entity = value
            If ((value Is Nothing)  _
                        = false) Then
                value.Orders.Add(Me)
                Me._CustomerID = value.CustomerID
            Else
                Me._CustomerID = CType(Nothing, String)
            End If
            Me.SendPropertyChanged("Customer")
        End If
    End Set
End Property

Дополнительные сведения см. в разделе, посвященном атрибуту ассоциации в Attribute-Based Mapping.

Методы LINQ to SQL и хранимые процедуры базы данных

LINQ to SQL поддерживает хранимые процедуры и определяемые пользователем функции. В LINQ to SQL эти абстракции, определенные базой данных, сопоставляются с клиентскими объектами, чтобы получить к ним доступ строго типизированным образом из клиентского кода. Сигнатуры метода выглядят как можно ближе к сигнатурам процедур и функций, определенных в базе данных. Для обнаружения этих методов можно использовать IntelliSense.

Набор результатов, возвращаемый вызовом сопоставленной процедуры, представляет собой строго типизированную коллекцию.

LINQ to SQL сопоставляет хранимые процедуры и функции с методами, используя атрибуты FunctionAttribute и ParameterAttribute. Методы, представляющие хранимые процедуры, отличаются от тех, которые представляют определяемые пользователем функции свойством IsComposable . Если для этого свойства задано значение false (по умолчанию), метод представляет хранимую процедуру. Если задано значение true, метод представляет функцию базы данных.

Замечание

При использовании Visual Studio можно использовать конструктор реляционных объектов для создания методов, сопоставленных с хранимыми процедурами и определяемыми пользователем функциями.

Пример

// This is an example of a stored procedure in the Northwind
// sample database. The IsComposable property defaults to false.
[Function(Name="dbo.CustOrderHist")]
public ISingleResult<CustOrderHistResult> CustOrderHist([Parameter(Name="CustomerID", DbType="NChar(5)")] string customerID)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID);
    return ((ISingleResult<CustOrderHistResult>)(result.ReturnValue));
}
   ' This is an example of a stored procedure in the Northwind
   ' sample database. The IsComposable property defaults to false.
   <FunctionAttribute(Name:="dbo.CustOrderHist")> _
Public Function CustOrderHist(<Parameter(Name:="CustomerID", DbType:="NChar(5)")> ByVal customerID As String) As ISingleResult(Of CustOrderHistResult)
       Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo.GetCurrentMethod, MethodInfo), customerID)
       Return CType(result.ReturnValue, ISingleResult(Of CustOrderHistResult))
   End Function

Дополнительные сведения см. в разделах атрибута функции, атрибута хранимой процедуры и атрибута параметра сопоставленияAttribute-Based и хранимых процедур.

См. также