Модель объектов LINQ to SQL
В LINQ to SQL объектная модель, выраженная на языке программирования разработчика, сопоставляется с моделью данных реляционной базы данных. После этого операции с данными выполняются в соответствии с объектной моделью.
В данном сценарии команды базы данных (например, INSERT
) не выполняются в базе данных. Вместо этого изменение значений и выполнение методов происходит в рамках объектной модели. Если вы хотите запросить базу данных или отправить изменения, LINQ to SQL преобразует запросы в правильные команды SQL и отправляет эти команды в базу данных.
Наиболее фундаментальные элементы объектной модели 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
Дополнительные сведения см. в разделах атрибута функции, атрибута хранимой процедуры и атрибута параметра в разделах сопоставления на основе атрибутов и хранимых процедур.