W poniższych sekcjach opisano niektóre typowe problemy, które mogą wystąpić podczas implementowania LINQ.
Dodatkowe problemy zostały rozwiązane w temacie Rozwiązywanie problemów.
Nie można Połączenie
Nie mogę nawiązać połączenia z bazą danych.
Upewnij się, że parametry połączenia jest poprawna i że wystąpienie programu SQL Server jest uruchomione. Należy również pamiętać, że protokół LINQ to SQL wymaga włączenia protokołu nazwanych potoków. Aby uzyskać więcej informacji, zobacz Edukacja by Walkthroughs (Przewodniki).
Zmiany utraconej bazy danych
Wprowadzono zmianę danych w bazie danych, ale po ponownym uruchomieniu aplikacji zmiana już nie istnieje.
Upewnij się, że wywołasz metodę SubmitChanges , aby zapisać wyniki w bazie danych.
Połączenie bazy danych: jak długo?
Jak długo pozostaje otwarte połączenie z bazą danych?
Połączenie zwykle pozostaje otwarte do momentu korzystania z wyników zapytania. Jeśli oczekujesz czasu na przetworzenie wszystkich wyników i nie chcesz buforować wyników, zastosuj je ToList do zapytania. W typowych scenariuszach, w których każdy obiekt jest przetwarzany tylko raz, model przesyłania strumieniowego jest lepszy zarówno w modelu LINQ to SQL, jak DataReader
i LINQ to SQL.
Szczegółowe informacje o użyciu połączenia zależą od następujących elementów:
Połączenie stan, jeśli DataContext obiekt jest skonstruowany z obiektem połączenia.
ustawienia ciągu Połączenie ion (na przykład włączenie wielu aktywnych zestawów wyników (MARS). Aby uzyskać więcej informacji, zobacz Wiele aktywnych zestawów wyników (MARS).
Aktualizowanie bez wykonywania zapytań
Czy mogę zaktualizować dane tabeli bez uprzedniego wykonywania zapytań względem bazy danych?
Mimo że linQ to SQL nie ma poleceń aktualizacji opartych na ustawieniu, można użyć jednej z następujących technik do aktualizacji bez uprzedniego wykonywania zapytań:
Użyj ExecuteCommand polecenia , aby wysłać kod SQL.
Utwórz nowe wystąpienie obiektu i zainicjuj wszystkie bieżące wartości (pola), które mają wpływ na aktualizację. Następnie dołącz obiekt do DataContext obiektu przy użyciu i Attach zmodyfikuj pole, które chcesz zmienić.
Nieoczekiwane wyniki zapytania
Moje zapytanie zwraca nieoczekiwane wyniki. Jak sprawdzić, co się dzieje?
LINQ to SQL udostępnia kilka narzędzi do sprawdzania wygenerowanego kodu SQL. Jednym z najważniejszych elementów jest Log. Aby uzyskać więcej informacji, zobacz Debugowanie pomocy technicznej.
Nieoczekiwane wyniki procedury składowanej
Mam procedurę składowaną, której wartość zwracana jest obliczana przez "MAX()". Podczas przeciągania procedury składowanej na powierzchnię O/R Projektant wartość zwracana nie jest poprawna.
LINQ to SQL udostępnia dwa sposoby zwracania wartości generowanych przez bazę danych za pomocą procedur składowanych:
Nazewnictwo wyniku wyjściowego.
Jawnie określając parametr wyjściowy.
Poniżej przedstawiono przykład nieprawidłowych danych wyjściowych. Ponieważ linQ to SQL nie może mapować wyników, zawsze zwraca wartość 0:
create procedure proc2
as
begin
select max(i) from t where name like 'hello'
end
Poniżej przedstawiono przykład poprawnych danych wyjściowych przy użyciu parametru wyjściowego:
create procedure proc2
@result int OUTPUT
as
select @result = MAX(i) from t where name like 'hello'
go
Poniżej przedstawiono przykład poprawnych danych wyjściowych, nazewnictwa wyniku wyjściowego:
create procedure proc2
as
begin
select nax(i) AS MaxResult from t where name like 'hello'
end
Aby uzyskać więcej informacji, zobacz Dostosowywanie operacji przy użyciu procedur składowanych.
Błędy serializacji
Podczas próby serializacji otrzymuję następujący błąd: "Wpisz 'System.Data.Linq.ChangeTracker+StandardChangeTracker' ... nie jest oznaczony jako serializowalny".
Generowanie kodu w linQ to SQL obsługuje DataContractSerializer serializacji. Nie obsługuje XmlSerializerBinaryFormatterani . Aby uzyskać więcej informacji, zobacz Serializacja.
Wiele plików DBML
Jeśli mam wiele plików DBML, które współdzielą niektóre tabele, występuje błąd kompilatora.
Ustaw właściwości przestrzeni nazw kontekstu i przestrzeni nazw jednostek z Projektant obiektu na unikatową wartość dla każdego pliku DBML. Takie podejście eliminuje kolizję przestrzeni nazw/nazw.
Unikanie jawnego ustawienia wartości generowanych przez bazę danych podczas wstawiania lub aktualizowania
Mam tabelę bazy danych z kolumną "DateCreated", która domyślnie ma wartość SQL "Getdate()". Gdy próbuję wstawić nowy rekord przy użyciu linQ to SQL, wartość zostanie ustawiona na wartość "NULL". Spodziewam się, że zostanie ona ustawiona na domyślną bazę danych.
LINQ to SQL obsługuje tę sytuację automatycznie dla tożsamości (przyrostu automatycznego) i rowguidcol (identyfikator GUID generowanego przez bazę danych) i kolumn sygnatury czasowej. W innych przypadkach należy ręcznie ustawić IsDbGenerated=true
właściwości iAutoSync=/AlwaysOnInsert/OnUpdate.
Wiele elementów DataLoadOptions
Czy mogę określić dodatkowe opcje ładowania bez zastępowania pierwszego?
Tak. Pierwszy nie jest zastępowany, jak w poniższym przykładzie:
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);
Błędy podczas korzystania z programu SQL Compact 3.5
Otrzymuję błąd podczas przeciągania tabel z bazy danych SQL Server Compact 3.5.
Relacyjna Projektant obiektów nie obsługuje programu SQL Server Compact 3.5, chociaż środowisko uruchomieniowe LINQ to SQL nie jest obsługiwane. W takiej sytuacji należy utworzyć własne klasy jednostek i dodać odpowiednie atrybuty.
Błędy w relacjach dziedziczenia
Użyto kształtu dziedziczenia przybornika w Projektant Obiekt, aby połączyć dwie jednostki, ale występują błędy.
Tworzenie relacji nie wystarczy. Należy podać informacje, takie jak kolumna dyskryminująca, wartość dyskryminująca klasy bazowej i wartość dyskryminująca klasy pochodnej.
Model dostawcy
Czy dostępny jest model dostawcy publicznego?
Nie jest dostępny model dostawcy publicznego. Obecnie linQ to SQL obsługuje tylko programy SQL Server i SQL Server Compact 3.5.
Ataki polegających na wstrzyknięciu kodu SQL
W jaki sposób linQ to SQL jest chroniony przed atakami polegającymi na wstrzyknięciu kodu SQL?
Wstrzyknięcie kodu SQL jest istotnym zagrożeniem dla tradycyjnych zapytań SQL utworzonych przez łączenie danych wejściowych użytkownika. LINQ to SQL unika takiego wstrzykiwania przy użyciu SqlParameter w zapytaniach. Dane wejściowe użytkownika są przekształcane w wartości parametrów. Takie podejście uniemożliwia korzystanie ze złośliwych poleceń z danych wejściowych klienta.
Zmiana flagi tylko do odczytu w plikach DBML
Jak mogę wyeliminować metody ustawiania z niektórych właściwości podczas tworzenia modelu obiektów z pliku DBML?
Wykonaj następujące kroki dla tego zaawansowanego scenariusza:
W pliku dbml zmodyfikuj właściwość, zmieniając flagę IsReadOnly na
True
.Dodaj klasę częściową. Utwórz konstruktor z parametrami dla elementów członkowskich tylko do odczytu.
Przejrzyj wartość domyślną UpdateCheck (Never), aby określić, czy jest to poprawna wartość aplikacji.
Uwaga
Jeśli używasz Projektant relacyjnych obiektów w programie Visual Studio, zmiany mogą zostać zastąpione.
APTCA
Czy system.Data.Linq jest oznaczony do użycia przez częściowo zaufany kod?
Tak, zestaw System.Data.Linq.dll należy do tych zestawów programu .NET Framework oznaczonych atrybutem AllowPartiallyTrustedCallersAttribute . Bez tego oznaczenia zestawy w programie .NET Framework są przeznaczone tylko do użytku przez w pełni zaufany kod.
Głównym scenariuszem w języku LINQ to SQL umożliwiającym częściowo zaufanym obiektom wywołującym jest umożliwienie dostępu do zestawu LINQ to SQL z aplikacji internetowych, gdzie konfiguracja zaufania to Średni.
Mapowanie danych z wielu tabel
Dane w mojej jednostce pochodzą z wielu tabel. Jak mogę mapować go?
Widok można utworzyć w bazie danych i zamapować jednostkę na widok. LINQ to SQL generuje ten sam język SQL dla widoków, co w przypadku tabel.
Uwaga
Korzystanie z widoków w tym scenariuszu ma ograniczenia. Takie podejście działa najlepiej, gdy operacje wykonywane Table<TEntity> na platformie są obsługiwane przez widok bazowy. Wiesz tylko, które operacje są zamierzone. Na przykład większość aplikacji jest tylko do odczytu, a kolejna większa liczba wykonuje Create
//Update
Delete
operacje tylko przy użyciu procedur składowanych względem widoków.
Pula połączeń
Czy istnieje konstrukcja, która może pomóc w buforowaniu danychContext?
Nie próbuj ponownie używać wystąpień programu DataContext. Każdy DataContext zachowuje stan (w tym pamięć podręczną tożsamości) dla jednej konkretnej sesji edycji/zapytania. Aby uzyskać nowe wystąpienia na podstawie bieżącego stanu bazy danych, użyj nowego DataContext.
Nadal można używać bazowych ADO.NET buforowania połączeń. Aby uzyskać więcej informacji, zobacz Sql Server Połączenie ion Pooling (ADO.NET).
Drugi element DataContext nie został zaktualizowany
Użyto jednego wystąpienia elementu DataContext do przechowywania wartości w bazie danych. Jednak drugi element DataContext w tej samej bazie danych nie odzwierciedla zaktualizowanych wartości. Drugie wystąpienie elementu DataContext wydaje się zwracać buforowane wartości.
Wynika to z ustawienia fabrycznego. LinQ to SQL nadal zwraca te same wystąpienia/wartości, które są wyświetlane w pierwszym wystąpieniu. Podczas wprowadzania aktualizacji używasz optymistycznej współbieżności. Oryginalne dane są używane do sprawdzania stanu bieżącej bazy danych w celu potwierdzenia, że w rzeczywistości nadal pozostają niezmienione. Jeśli uległa zmianie, wystąpi konflikt, a aplikacja musi ją rozwiązać. Jedną z opcji aplikacji jest zresetowanie oryginalnego stanu do bieżącego stanu bazy danych i ponowne wypróbowanie aktualizacji. Aby uzyskać więcej informacji, zobacz How to: Manage Change Conflicts (Jak zarządzać konfliktami zmian).
Można również ustawić ObjectTrackingEnabled wartość false, co powoduje wyłączenie buforowania i śledzenia zmian. Następnie możesz pobrać najnowsze wartości za każdym razem, gdy wykonujesz zapytanie.
Nie można wywołać funkcji SubmitChanges w trybie tylko do odczytu
Podczas próby wywołania funkcji SubmitChanges w trybie tylko do odczytu występuje błąd.
Tryb tylko do odczytu wyłącza możliwość śledzenia zmian w kontekście.