Модель объектов LINQ to SQL
Обновлен: November 2007
В LINQ to SQL объектная модель, выраженная на языке программирования разработчика, сопоставляется модели данных реляционной базы данных. После этого операции с данными выполняются в соответствии с объектной моделью.
В данном сценарии команды базы данных (например, INSERT) не выполняются в базе данных. Вместо этого изменение значений и выполнение методов происходит в рамках объектной модели. Если необходимо отправить запрос к базе данных или передать изменения, LINQ to SQL преобразует требования в корректные команды SQL и отправляет эти команды в базу данных.
В следующей таблице представлены самые основные элементы в объектной модели LINQ to SQL и их связь с элементами в реляционной модели данных.
Объектная модель LINQ to SQL |
Реляционная модель данных |
---|---|
Класс сущностей |
Таблица |
Член класса |
Столбец |
Связь |
Отношение внешнего ключа |
Метод |
Хранимая процедура или функция |
Примечание. |
---|
Следующие сведения подразумевают наличие базовых знаний о реляционной модели данных и правилах. |
Таблицы классов сущностей и баз данных 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, метод представляет функцию базы данных.
Примечание. |
---|
При использовании 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)