Das LINQ to SQL-Objektmodell

Aktualisiert: November 2007

In LINQ to SQL wird ein in der Programmiersprache des Entwicklers ausgedrücktes Objektmodell dem Datenmodell einer relationalen Datenbank zugeordnet. Operationen mit den Daten werden dann nach dem Objektmodell durchgeführt.

In diesem Szenario übergeben Sie keine Datenbankbefehle (z. B. INSERT) an die Datenbank. Stattdessen ändern Sie Werte und führen Methoden innerhalb des Objektmodells aus. Wenn Sie die Datenbank abfragen oder Änderungen übergeben möchten, übersetzt LINQ to SQL Ihre Anforderungen in die richtigen SQL-Befehle und sendet diese an die Datenbank.

LINQ-to-SQL-Objektmodell

In der nachfolgenden Tabelle werden die grundlegenden Elemente im LINQ to SQL-Objektmodell und deren Beziehungen zu Elementen im relationalen Datenmodell aufgeführt:

LINQ to SQL-Objektmodell

Relationales Datenmodell

Entitätsklasse

Tabelle

Klassenmember

Spalte

Zuordnung

Fremdschlüsselbeziehung

Methode

Gespeicherte Prozedur oder Funktion

Hinweis:

Die folgenden Beschreibungen gehen davon aus, dass Sie über Grundkenntnisse des relationalen Datenmodells und der Regeln verfügen.

LINQ to SQL-Entitätsklassen und Datenbanktabellen

In LINQ to SQL wird eine Datenbanktabelle durch eine Entitätsklasse dargestellt. Eine Entitätsklasse entspricht jeder anderen Klasse, die Sie erstellen können. Allerdings fügen Sie der Klasse Anmerkungen mit speziellen Informationen hinzu, die diese Klasse einer Datenbanktabelle zuweisen. Sie fügen diese Anmerkungen hinzu, indem Sie Ihrer Klassendeklaration ein benutzerdefiniertes Attribut (TableAttribute) hinzufügen. Siehe hierzu das folgende Beispiel:

Beispiel

<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;
}

Nur als Tabelle deklarierte Klasseninstanzen (Entitätsklassen) können in der Datenbank gespeichert werden.

Weitere Informationen finden Sie im Abschnitt zu Tabellenattributen unter Attributbasierte Zuordnung (LINQ to SQL).

LINQ to SQL-Klassenmember und Datenbankspalten

Neben der Zuordnung von Klassen zu Tabellen legen Sie Felder oder Eigenschaften fest, um Datenbankspalten darzustellen. Zu diesem Zweck definiert LINQ to SQL das ColumnAttribute-Attribut wie im folgenden Beispiel:

Beispiel

<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;
}

Nur Felder und Eigenschaften, die Spalten zugeordnet werden, bleiben in der Datenbank erhalten oder werden aus dieser abgerufen. Alle übrigen Elemente gelten als Übergangsteile Ihrer Anwendungslogik.

Das ColumnAttribute-Attribut weist eine Reihe von Eigenschaften auf, mit denen Sie die Member, die Spalten darstellen, anpassen können (sie können z. B. ein Member für die Darstellung einer Primärschlüsselspalte festlegen). Weitere Informationen finden Sie im Abschnitt zu Spaltenattributen unter Attributbasierte Zuordnung (LINQ to SQL).

LINQ to SQL-Zuordnungen und Datenbank-Fremdschlüsselbeziehungen

In LINQ to SQL werden Datenbankzuordnungen (z. B. Fremdschlüssel zu Primärschlüsselbeziehungen) durch Anwenden des AssociationAttribute-Attributs dargestellt. Im folgenden Codesegment enthält die Order-Klasse eine Customer-Eigenschaft mit einem AssociationAttribute-Attribut. Diese Eigenschaft und ihr Attribut stellen die Order-Klasse mit einer Beziehung zur Customer-Klasse bereit.

Im folgenden Codebeispiel wird die Customer-Eigenschaft der Order-Klasse gezeigt.

Beispiel

 <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");
            }
        }
    }

Weitere Informationen finden Sie im Abschnitt zum Association-Attribut unter Attributbasierte Zuordnung (LINQ to SQL).

LINQ to SQL-Methoden und in der Datenbank gespeicherte Prozeduren

LINQ to SQL unterstützt gespeicherte Prozeduren und benutzerdefinierte Funktionen. In LINQ to SQL weisen Sie diese in der Datenbank definierten Abstraktionen den Client-Objekten zu, sodass Sie diese vom Client-Code aus mit strikter Typzuordnung nutzen können. Die Methodensignaturen entsprechen so weit wie möglich den Signaturen der Prozeduren und Funktionen in der Datenbank. Sie können IntelliSense verwenden, um diese Methoden zu ermitteln.

Ein von einem Aufruf einer zugeordneten Prozedur zurückgegebener Ergebnissatz ist eine Auflistung mit strikter Typzuordnung.

LINQ to SQL ordnet gespeicherte Prozeduren und Funktionen den Methoden durch Verwendung des FunctionAttribute-Attribut und des ParameterAttribute-Attribut zu. Methoden, die gespeicherte Prozeduren darstellen, werden von jenen unterschieden, die benutzerdefinierte Funktionen durch die IsComposable-Eigenschaft darstellen. Wenn diese Eigenschaft auf false (Standard) festgelegt wird, stellt die Methode eine gespeicherte Prozedur dar. Wenn sie auf true festgelegt wird, stellt die Methode eine Datenbankfunktion dar.

Hinweis:

Wenn Sie Visual Studio verwenden, können Sie mit O/R-Designer Methoden erstellen, die gespeicherten Prozeduren und benutzerdefinierten Funktionen zugeordnet werden.

Beispiel

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

Weitere Informationen finden Sie in den Abschnitten zu Funktionsattributen, Attributen gespeicherter Prozeduren und Parameterattributen unter Attributbasierte Zuordnung (LINQ to SQL) und Gespeicherte Prozeduren (LINQ to SQL).

Siehe auch

Referenz

Attributbasierte Zuordnung (LINQ to SQL)

Weitere Ressourcen

Hintergrundinformationen (LINQ to SQL)