Model obiektu LINQ to SQL
W linQ to SQL model obiektów wyrażony w języku programowania dewelopera jest mapowany na model danych relacyjnej bazy danych. Operacje na danych są następnie przeprowadzane zgodnie z modelem obiektów.
W tym scenariuszu polecenia bazy danych (na przykład INSERT
) nie są wystawiane w bazie danych. Zamiast tego zmienia się wartości i wykonuje metody w modelu obiektów. Jeśli chcesz wysłać zapytanie do bazy danych lub wysłać je zmiany, linQ to SQL tłumaczy żądania na poprawne polecenia SQL i wysyła te polecenia do bazy danych.
Najbardziej podstawowe elementy w modelu obiektów LINQ to SQL i ich relacje z elementami w modelu danych relacyjnych zostały podsumowane w poniższej tabeli:
LINQ to SQL Object Model | Model danych relacyjnych |
---|---|
Klasa jednostki | Table |
Składowa klasy | Kolumna |
Skojarzenie | Relacja klucza obcego |
Method | Procedura składowana lub funkcja |
Uwaga
W poniższych opisach założono, że masz podstawową wiedzę na temat modelu i reguł relacyjnych danych.
Klasy jednostek LINQ to SQL i tabele baz danych
W linQ to SQL tabela bazy danych jest reprezentowana przez klasę jednostek. Klasa jednostki jest podobna do każdej innej klasy, którą można utworzyć, z tą różnicą, że dodawać adnotacje do klasy przy użyciu informacji specjalnych, które kojarzą klasę z tabelą bazy danych. Tę adnotację należy utworzyć, dodając atrybut niestandardowy (TableAttribute) do deklaracji klasy, jak w poniższym przykładzie:
Przykład
[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
W bazie danych można zapisywać tylko wystąpienia klas zadeklarowanych jako tabele (czyli klasy jednostek).
Aby uzyskać więcej informacji, zobacz sekcję Atrybut tabeli mapowania opartego na atrybutach.
Elementy członkowskie klas LINQ to SQL i kolumny bazy danych
Oprócz kojarzenia klas z tabelami należy wyznaczyć pola lub właściwości reprezentujące kolumny bazy danych. W tym celu LINQ to SQL definiuje ColumnAttribute atrybut, jak w poniższym przykładzie:
Przykład
[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
Tylko pola i właściwości mapowane na kolumny są utrwalane lub pobierane z bazy danych. Te, które nie są deklarowane jako kolumny, są traktowane jako przejściowe części logiki aplikacji.
Atrybut ColumnAttribute ma różne właściwości, których można użyć do dostosowania tych elementów członkowskich reprezentujących kolumny (na przykład wyznaczenie elementu członkowskiego jako reprezentującego kolumnę klucza podstawowego). Aby uzyskać więcej informacji, zobacz sekcję Atrybut kolumny mapowania opartego na atrybutach.
Skojarzenia LINQ to SQL i relacje klucza obcego bazy danych
W linQ to SQL reprezentujesz skojarzenia bazy danych (takie jak relacje klucza obcego do klucza podstawowego AssociationAttribute ), stosując atrybut. W poniższym segmencie kodu Order
klasa zawiera Customer
właściwość, która ma AssociationAttribute atrybut. Ta właściwość i jej atrybut zapewniają klasę Order
relacją z klasą Customer
.
Poniższy przykład kodu przedstawia Customer
właściwość z Order
klasy .
Przykład
[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
Aby uzyskać więcej informacji, zobacz sekcję Atrybut skojarzenia mapowania opartego na atrybutach.
Metody LINQ to SQL i procedury składowane bazy danych
LINQ to SQL obsługuje procedury składowane i funkcje zdefiniowane przez użytkownika. W linQ to SQL mapujesz te abstrakcje zdefiniowane przez bazę danych na obiekty klienckie, aby można było uzyskać do nich dostęp w sposób silnie typowany z poziomu kodu klienta. Podpisy metody przypominają jak najbliżej podpisy procedur i funkcji zdefiniowanych w bazie danych. Aby odnaleźć te metody, możesz użyć funkcji IntelliSense.
Zestaw wyników zwracany przez wywołanie procedury mapowanej jest silnie typizowaną kolekcją.
LINQ to SQL mapuje procedury składowane i funkcje na metody przy użyciu FunctionAttribute atrybutów i ParameterAttribute . Metody reprezentujące procedury składowane różnią się od metod reprezentujących funkcje zdefiniowane przez użytkownika przez IsComposable właściwość . Jeśli ta właściwość jest ustawiona na false
(wartość domyślna), metoda reprezentuje procedurę składowaną. Jeśli jest ustawiona na true
wartość , metoda reprezentuje funkcję bazy danych.
Uwaga
Jeśli używasz programu Visual Studio, możesz użyć relacyjnej Projektant obiektu, aby utworzyć metody mapowane na procedury składowane i funkcje zdefiniowane przez użytkownika.
Przykład
// 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
Aby uzyskać więcej informacji, zobacz sekcje Atrybut funkcji, Atrybut procedury składowanej i Atrybut parametru mapowania opartego na atrybutach i procedur składowanych.