Udostępnij za pośrednictwem


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.

Screenshot that shows the Linq Object Model.

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 truewartość , 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.

Zobacz też