Freigeben über


Häufig gestellte Fragen

In den folgenden Abschnitten werden einige häufige Probleme beantwortet, die beim Implementieren von LINQ auftreten können.

Weitere Probleme werden in der Problembehandlung behoben.

Verbindung kann nicht hergestellt werden

Ich kann keine Verbindung mit meiner Datenbank herstellen.

Stellen Sie sicher, dass die Verbindungszeichenfolge korrekt ist und dass Ihre SQL Server-Instanz ausgeführt wird. Beachten Sie auch, dass LINQ to SQL erfordert, dass das Named Pipes-Protokoll aktiviert ist. Weitere Informationen finden Sie unter "Learning by Walkthroughs".

Änderungen an verlorener Datenbank

Ich habe eine Änderung an Den Daten in der Datenbank vorgenommen, aber wenn ich meine Anwendung erneut raniere, war die Änderung nicht mehr vorhanden.

Stellen Sie sicher, dass Sie zum Speichern von Ergebnissen in der Datenbank aufrufen SubmitChanges .

Datenbankverbindung: Wie lange öffnen?

Wie lange bleibt meine Datenbankverbindung geöffnet?

Eine Verbindung bleibt in der Regel geöffnet, bis Sie die Abfrageergebnisse nutzen. Wenn Sie davon ausgehen, dass alle Ergebnisse verarbeitet werden und nicht zwischengespeichert werden, wenden Sie sich auf ToList die Abfrage an. In gängigen Szenarien, in denen jedes Objekt nur einmal verarbeitet wird, ist das Streamingmodell sowohl in SQL als DataReader auch in LINQ to SQL überlegen.

Die genauen Details der Verbindungsnutzung hängen von den folgenden Faktoren ab:

Aktualisierung ohne Abfrage

Kann ich Tabellendaten aktualisieren, ohne zuerst die Datenbank abfragen zu müssen?

Obwohl LINQ to SQL keine setbasierten Updatebefehle enthält, können Sie eine der folgenden Techniken verwenden, um ohne erste Abfrage zu aktualisieren:

  • Wird zum Senden von SQL-Code verwendet ExecuteCommand .

  • Erstellen Sie eine neue Instanz des Objekts, und initialisieren Sie alle aktuellen Werte (Felder), die sich auf die Aktualisierung auswirken. Fügen Sie dann das Objekt mithilfe DataContext des zu ändernden Felds an, Attach und ändern Sie es.

Unerwartete Abfrageergebnisse

Meine Abfrage gibt unerwartete Ergebnisse zurück. Wie kann ich prüfen, was passiert?

LINQ to SQL bietet verschiedene Tools zum Überprüfen des generierten SQL-Codes. Einer der wichtigsten ist Log. Weitere Informationen finden Sie unter Debugging-Support.

Unerwartete Ergebnisse gespeicherter Prozeduren

Ich habe eine gespeicherte Prozedur, deren Rückgabewert durch "MAX()" berechnet wird. Wenn ich die gespeicherte Prozedur auf die O/R Designer-Oberfläche ziehe, ist der Rückgabewert nicht korrekt.

LINQ to SQL bietet zwei Möglichkeiten, datenbankgenerierte Werte mithilfe von gespeicherten Prozeduren zurückzugeben:

  • Durch Benennen des Ausgabeergebnisses.

  • Durch explizite Angabe eines Ausgabeparameters.

Im Folgenden sehen Sie ein Beispiel für eine falsche Ausgabe. Da LINQ to SQL die Ergebnisse nicht zuordnen kann, wird immer 0 zurückgegeben:

create procedure proc2

as

begin

select max(i) from t where name like 'hello'

end

Im Folgenden sehen Sie ein Beispiel für eine korrekte Ausgabe mithilfe eines Ausgabeparameters:

create procedure proc2

@result int OUTPUT

as

select @result = MAX(i) from t where name like 'hello'

go

Im Folgenden sehen Sie ein Beispiel für eine korrekte Ausgabe, indem Sie das Ausgabeergebnis benennen:

create procedure proc2

as

begin

select nax(i) AS MaxResult from t where name like 'hello'

end

Weitere Informationen finden Sie unter Anpassen von Vorgängen mithilfe von gespeicherten Prozeduren.

Serialisierungsfehler

Wenn ich versuche, die Serialisierung zu serialisieren, erhalte ich die folgende Fehlermeldung: "Typ 'System.Data.Linq.ChangeTracker+StandardChangeTracker' ... ist nicht als serialisierbar gekennzeichnet."

Die Codegenerierung in LINQ to SQL unterstützt DataContractSerializer die Serialisierung. Es wird nicht unterstützt XmlSerializer oder BinaryFormatter. Weitere Informationen finden Sie unter Serialization (Serialisierung).

Mehrere DBML-Dateien

Wenn ich mehrere DBML-Dateien habe, die einige Tabellen gemeinsam nutzen, erhalte ich einen Compilerfehler.

Legen Sie die Eigenschaften Kontextnamespace und Entitätsnamespace aus dem Objektrelational-Designer auf einen eindeutigen Wert für jede DBML-Datei fest. Bei diesem Ansatz wird die Namens-/Namespacekollision beseitigt.

Vermeiden der expliziten Einstellung von Database-Generated Werten beim Einfügen oder Aktualisieren

Ich habe eine Datenbanktabelle mit einer Spalte "DateCreated", die standardmäßig sql "Getdate()" lautet. Wenn ich versuche, einen neuen Datensatz mithilfe von LINQ to SQL einzufügen, wird der Wert auf "NULL" festgelegt. Ich würde erwarten, dass sie auf die Datenbankstandard festgelegt wird.

LINQ to SQL behandelt diese Situation automatisch für Identitätsspalten (automatisches Inkrement) und Rowguidcol (datenbankgenerierte GUID) und Zeitstempelspalten. In anderen Fällen sollten Sie manuell festlegen undIsDbGenerated=trueAutoSync=Always/ Eigenschaften festlegen.OnInsert/OnUpdate

Mehrere DataLoadOptions

Kann ich zusätzliche Ladeoptionen angeben, ohne den ersten zu überschreiben?

Ja. Der erste wird nicht überschrieben, wie im folgenden Beispiel gezeigt:

Dim dlo As New DataLoadOptions()
dlo.LoadWith(Of Order)(Function(o As Order) o.Customer)
dlo.LoadWith(Of Order)(Function(o As Order) o.OrderDetails)
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Order>(o => o.Customer);
dlo.LoadWith<Order>(o => o.OrderDetails);

Fehler bei Verwendung von SQL Compact 3.5

Beim Ziehen von Tabellen aus einer SQL Server Compact 3.5-Datenbank wird eine Fehlermeldung angezeigt.

Der objektrelationale Designer unterstützt SQL Server Compact 3.5 nicht, obwohl die LINQ to SQL-Laufzeit ausgeführt wird. In diesem Fall müssen Sie Ihre eigenen Entitätsklassen erstellen und die entsprechenden Attribute hinzufügen.

Fehler in Vererbungsbeziehungen

Ich habe das Vererbungs-Shape der Toolbox im Objektrelational-Designer verwendet, um zwei Entitäten zu verbinden, aber ich erhalte Fehler.

Das Erstellen der Beziehung reicht nicht aus. Sie müssen Informationen wie die Diskriminatorspalte, den Wert der Basisklasse diskriminator und den abgeleiteten Klassendiskriminatorwert angeben.

Anbietermodell

Ist ein öffentliches Anbietermodell verfügbar?

Es ist kein öffentliches Anbietermodell verfügbar. Derzeit unterstützt LINQ to SQL nur SQL Server und SQL Server Compact 3.5.

SQL-Injection Angriffe

Wie ist LINQ to SQL vor SQL-Injection-Angriffen geschützt?

Die SQL-Einfügung ist ein erhebliches Risiko für herkömmliche SQL-Abfragen, die durch verkettete Benutzereingaben gebildet wurden. LINQ to SQL vermeidet solche Einfügungen in SqlParameter Abfragen. Die Benutzereingabe wird in Parameterwerte umgewandelt. Dieser Ansatz verhindert, dass böswillige Befehle von Kundeneingaben verwendet werden.

Ändern des schreibgeschützten Flags in DBML-Dateien

Wie lösche ich Setter aus einigen Eigenschaften, wenn ich ein Objektmodell aus einer DBML-Datei erstelle?

Führen Sie die folgenden Schritte für dieses erweiterte Szenario aus:

  1. Ändern Sie in der DBML-Datei die Eigenschaft, indem Sie das IsReadOnly Flag in True.

  2. Fügen Sie eine partielle Klasse hinzu. Erstellen Sie einen Konstruktor mit Parametern für die schreibgeschützten Member.

  3. Überprüfen Sie den Standardwert UpdateCheck (Never), um zu bestimmen, ob dies der richtige Wert für Ihre Anwendung ist.

    Vorsicht

    Wenn Sie den objektrelationalen Designer in Visual Studio verwenden, werden ihre Änderungen möglicherweise überschrieben.

APTCA

Ist System.Data.Linq für die Verwendung durch teilweise vertrauenswürdigen Code markiert?

Ja, die System.Data.Linq.dll-Assembly gehört zu den .NET Framework-Assemblys, die mit dem AllowPartiallyTrustedCallersAttribute Attribut gekennzeichnet sind. Ohne diese Markierung sind Assemblys in .NET Framework nur für voll vertrauenswürdigen Code vorgesehen.

Das Hauptszenario in LINQ to SQL zum Zulassen teilweise vertrauenswürdiger Aufrufer besteht darin, den Zugriff auf die LINQ to SQL-Assembly über Webanwendungen zu ermöglichen, wobei die Vertrauenskonfiguration "Mittel" ist.

Zuordnen von Daten aus mehreren Tabellen

Die Daten in meiner Entität stammen aus mehreren Tabellen. Wie kann ich es zuordnen?

Sie können eine Ansicht in einer Datenbank erstellen und die Entität der Ansicht zuordnen. LINQ to SQL generiert dieselbe SQL für Ansichten wie für Tabellen.

Hinweis

Die Verwendung von Ansichten in diesem Szenario hat Einschränkungen. Dieser Ansatz funktioniert am sichersten, wenn die ausgeführten Table<TEntity> Vorgänge von der zugrunde liegenden Ansicht unterstützt werden. Nur Sie wissen, welche Vorgänge vorgesehen sind. Die meisten Anwendungen sind beispielsweise schreibgeschützt, und eine andere größebare Zahl führt Create/Update/Delete Vorgänge nur mithilfe gespeicherter Prozeduren für Ansichten aus.

Verbindungspooling

Gibt es ein Konstrukt, das beim DataContext-Pooling hilfreich sein kann?

Versuchen Sie nicht, Instanzen von DataContext. Jeder DataContext verwaltet den Status (einschließlich eines Identitätscaches) für eine bestimmte Bearbeitungs-/Abfragesitzung. Um neue Instanzen basierend auf dem aktuellen Status der Datenbank abzurufen, verwenden Sie eine neue DataContext.

Sie können weiterhin zugrunde liegende ADO.NET Verbindungspools verwenden. Weitere Informationen finden Sie unter SQL Server-Verbindungspooling (ADO.NET).

Second DataContext Is Not Updated

Ich habe eine Instanz von DataContext zum Speichern von Werten in der Datenbank verwendet. Ein zweiter DataContext in derselben Datenbank spiegelt jedoch nicht die aktualisierten Werte wider. Die zweite DataContext-Instanz scheint zwischengespeicherte Werte zurückzugeben.

Dieses Verhalten ist beabsichtigt. LINQ to SQL gibt weiterhin dieselben Instanzen/Werte zurück, die Sie in der ersten Instanz gesehen haben. Wenn Sie Aktualisierungen vornehmen, verwenden Sie optimistische Parallelität. Die ursprünglichen Daten werden verwendet, um den aktuellen Datenbankstatus zu überprüfen, um zu bestätigen, dass sie tatsächlich noch unverändert ist. Wenn sich der Konflikt geändert hat, tritt ein Konflikt auf, und Die Anwendung muss sie beheben. Eine Option Ihrer Anwendung besteht darin, den ursprünglichen Zustand auf den aktuellen Datenbankstatus zurückzusetzen und das Update erneut zu versuchen. Weitere Informationen finden Sie unter How to: Manage Change Conflicts.

Sie können auch auf "false" festlegen ObjectTrackingEnabled , wodurch das Zwischenspeichern und die Änderungsnachverfolgung deaktiviert wird. Sie können dann bei jeder Abfrage die neuesten Werte abrufen.

SubmitChanges kann nicht im schreibgeschützten Modus aufgerufen werden

Wenn ich versuche, SubmitChanges im schreibgeschützten Modus aufzurufen, erhalte ich eine Fehlermeldung.

Der schreibgeschützte Modus deaktiviert die Möglichkeit des Kontexts, Änderungen nachzuverfolgen.