Модель объектов LINQ to SQL

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

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

Screenshot that shows the Linq Object Model.

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

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

Примечание.

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

Таблицы классов сущностей и баз данных 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

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

Дополнительные сведения см. в разделе "Атрибут таблицы" сопоставления на основе атрибутов.

Столбцы членов класса и базы данных 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 имеет целый ряд свойств, которые можно использовать для настройки членов, представляющих столбцы (например, назначение члена, представляющего столбец первичного ключа). Дополнительные сведения см. в разделе "Атрибут столбца" сопоставления на основе атрибутов.

Связи и отношения внешнего ключа баз данных 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

Дополнительные сведения см. в разделе "Атрибут ассоциации" сопоставления на основе атрибутов.

Хранимые процедуры методов и баз данных 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

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

См. также