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:
Verbindungsstatus, wenn das DataContext Objekt mit einem Verbindungsobjekt erstellt wird.
Verbindungszeichenfolgeneinstellungen (z. B. Aktivieren mehrerer aktiver Resultsets (MARS). Weitere Informationen finden Sie unter Multiple Active Result Sets (MARS).For more information, see Multiple Active Result Sets (MARS).
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=true
AutoSync=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:
Ändern Sie in der DBML-Datei die Eigenschaft, indem Sie das IsReadOnly Flag in
True
.Fügen Sie eine partielle Klasse hinzu. Erstellen Sie einen Konstruktor mit Parametern für die schreibgeschützten Member.
Ü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.