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


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

Обновлен: November 2007

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

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

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

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

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

Реляционная модель данных

Класс сущностей

Таблица

Член класса

Столбец

Связь

Отношение внешнего ключа

Метод

Хранимая процедура или функция

Bb386989.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

Пример

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

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

Дополнительные сведения см. в подразделе "Атрибут Table » раздела Сопоставление на основе атрибутов (LINQ to SQL).

Столбцы членов класса и базы данных LINQ to SQL

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

Пример

<Table(Name:="Customers")> _
Public Class Customer
    <Column(IsPrimaryKey:=True)> _
    Public CustomerID As String

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

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

Атрибут ColumnAttribute имеет целый ряд свойств, которые можно использовать для настройки членов, представляющих столбцы (например, назначение члена, представляющего столбец первичного ключа). Дополнительные сведения см. в подразделе "Атрибут Column » раздела Сопоставление на основе атрибутов (LINQ to SQL).

Связи и отношения внешнего ключа баз данных 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 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(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» раздела Сопоставление на основе атрибутов (LINQ to SQL).

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

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

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

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

Bb386989.alert_note(ru-ru,VS.90).gifПримечание.

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

Пример

   ' 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
    // 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));
    }

Дополнительные сведения см. в подразделах «Атрибуты функций», «Атрибуты хранимых процедур» и «Атрибуты параметров» в разделах Сопоставление на основе атрибутов (LINQ to SQL) и Хранимые процедуры (LINQ to SQL).

См. также

Ссылки

Сопоставление на основе атрибутов (LINQ to SQL)

Другие ресурсы

Дополнительные сведения (LINQ to SQL)