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

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

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

Screenshot that shows the Linq Object Model.

наиболее фундаментальные элементы в объектной модели 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

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

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

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

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

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

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

См. также