Az alábbi szakaszok választ adnak néhány gyakori problémára, amelyeket a LINQ megvalósításakor tapasztalhat.
A hibaelhárítás során további problémákat is elhárítunk.
Nem Csatlakozás
Nem tudok csatlakozni az adatbázisomhoz.
Győződjön meg arról, hogy a kapcsolati sztring helyes, és hogy az SQL Server-példány fut. Vegye figyelembe azt is, hogy az SQL-hez való LINQ használatához engedélyezni kell a Named Pipes protokollt. További információ: Tanulás útmutatók alapján.
Elveszett adatbázis módosítása
Módosítottam az adatbázisban lévő adatokat, de amikor újra bejelentkeztem az alkalmazásomba, a változás már nem volt ott.
Győződjön meg arról, hogy az eredményeket az adatbázisba való mentéshez hívja SubmitChanges meg.
Adatbázis-Csatlakozás ion: Mennyi ideig nyissa meg?
Mennyi ideig marad nyitva az adatbázis-kapcsolat?
A kapcsolat általában nyitva marad, amíg el nem használja a lekérdezés eredményeit. Ha arra számít, hogy időt vesz igénybe az összes eredmény feldolgozásához, és nem ellenzi az eredmények gyorsítótárazását, alkalmazza ToList a lekérdezésre. Olyan gyakori helyzetekben, amikor minden objektumot csak egyszer dolgoznak fel, a streamelési modell mind a LINQ-ban, mind DataReader
az SQL-ben jobb.
A kapcsolat használatának pontos részletei a következőktől függnek:
Csatlakozás ion állapota, ha a DataContext kapcsolati objektummal van létrehozva.
Csatlakozás ion sztringbeállítások (például több aktív eredményhalmaz (MARS) engedélyezése. További információ: Több aktív eredményhalmaz (MARS).
Frissítés lekérdezés nélkül
Frissíthetem a táblaadatokat az adatbázis első lekérdezése nélkül?
Bár az SQL-hez való LINQ nem rendelkezik beállításalapú frissítési parancsokkal, az alábbi technikák egyikével frissíthet az első lekérdezés nélkül:
SQL-kód küldéséhez használható ExecuteCommand .
Hozzon létre egy új objektumpéldányt, és inicializálja a frissítést befolyásoló összes aktuális értéket (mezőt). Ezután csatolja az objektumot az objektumhoz a DataContext módosítani kívánt mező használatával Attach és módosításával.
Váratlan lekérdezési eredmények
A lekérdezésem váratlan eredményeket ad vissza. Hogyan vizsgálhatom meg, hogy mi történik?
A LINQ–SQL számos eszközt biztosít a létrehozott SQL-kód vizsgálatához. Az egyik legfontosabb az .Log További információ: Hibakeresési támogatás.
Váratlan tárolt eljárás eredményei
Van egy tárolt eljárásom, amelynek visszatérési értékét a "MAX()" számítja ki. Amikor a tárolt eljárást az O/R Tervező felületére húzom, a visszatérési érték nem helyes.
A LINQ az SQL-hez kétféleképpen ad vissza adatbázis által generált értékeket tárolt eljárásokkal:
A kimeneti eredmény elnevezésével.
Egy kimeneti paraméter explicit megadásával.
Az alábbi példa helytelen kimenetre mutat. Mivel a LINQ és az SQL nem tudja megfeleltetni az eredményeket, mindig 0 értéket ad vissza:
create procedure proc2
as
begin
select max(i) from t where name like 'hello'
end
Az alábbiakban egy példa látható a helyes kimenetre egy kimeneti paraméter használatával:
create procedure proc2
@result int OUTPUT
as
select @result = MAX(i) from t where name like 'hello'
go
A következő példa a helyes kimenetre a kimeneti eredmény elnevezésével:
create procedure proc2
as
begin
select nax(i) AS MaxResult from t where name like 'hello'
end
További információ: Műveletek testreszabása tárolt eljárások használatával.
Szerializálási hibák
Amikor szerializálni próbálok, a következő hibaüzenet jelenik meg: "Type "System.Data.Linq.ChangeTracker+StandardChangeTracker" ... nincs szerializálhatóként megjelölve."
A LINQ-ból SQL-be történő kódlétrehozás támogatja DataContractSerializer a szerializálást. Nem támogatja vagy BinaryFormatternem támogatjaXmlSerializer. További információ: Szerializálás.
Több DBML-fájl
Ha több DBML-fájlom van, amelyek közös táblákat osztanak meg, fordítóhiba jelenik meg.
Állítsa be a környezeti névtér és az entitásnévtér tulajdonságait az objektumrelációs Tervező egy külön értékre az egyes DBML-fájlokhoz. Ez a módszer kiküszöböli a névtér és a névtér ütközését.
Az adatbázis által létrehozott értékek explicit beállításának elkerülése beszúráskor vagy frissítéskor
Van egy adatbázistáblám, amelynek "DateCreated" oszlopa alapértelmezés szerint a "Getdate()" SQL-t használja. Amikor új rekordot próbálok beszúrni a LINQ és az SQL használatával, az érték "NULL" értékre lesz állítva. Azt várnám, hogy az adatbázis alapértelmezett értékére legyen állítva.
A LINQ–SQL automatikusan kezeli ezt a helyzetet az identitás (automatikus növekmény) és a rowguidcol (adatbázis által generált GUID) és az időbélyegoszlopok esetében. Más esetekben manuálisan kell beállítania IsDbGeneratedtrue
=ésAlways=OnUpdateAutoSync/OnInsert/tulajdonságait.
Több DataLoadOptions
Megadhatok további betöltési beállításokat az első felülírása nélkül?
Igen. Az első nincs felülírva, mint az alábbi példában:
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);
Hibák az SQL Compact 3.5 használatával
Hibaüzenet jelenik meg, amikor táblákat húzok ki egy SQL Server Compact 3.5-adatbázisból.
Az objektumrelációs Tervező nem támogatja az SQL Server Compact 3.5-öt, bár a LINQ és az SQL futtatókörnyezet igen. Ebben az esetben létre kell hoznia saját entitásosztályokat, és hozzá kell adnia a megfelelő attribútumokat.
Öröklési kapcsolatok hibái
Az objektumrelációs Tervező eszközkészlet öröklési alakzatát használtam két entitás összekapcsolásához, de hibaüzenetek jelennek meg.
A kapcsolat létrehozása nem elég. Meg kell adnia olyan információkat, mint a diszkriminatív oszlop, az alaposztály diszkriminatív értéke és a származtatott osztály diszkriminatív értéke.
Szolgáltatói modell
Elérhető egy nyilvános szolgáltatói modell?
Nem érhető el nyilvános szolgáltatói modell. Jelenleg a LINQ to SQL csak az SQL Servert és az SQL Server Compact 3.5-öt támogatja.
SQL-injektálási támadások
Hogyan védi a LINQ és az SQL az SQL-et az SQL-injektálási támadásoktól?
Az SQL-injektálás jelentős kockázatot jelent a felhasználói bemenet összefűzésével létrehozott hagyományos SQL-lekérdezések esetében. A LINQ az SQL-hez lekérdezések használatával SqlParameter elkerüli az ilyen injektálásokat. A felhasználói bemenet paraméterértékekké alakul. Ez a módszer megakadályozza a rosszindulatú parancsok használatát az ügyfél bemenetéből.
Írásvédett jelző módosítása a DBML-fájlokban
Hogyan egyes tulajdonságokból kizárja a beállítókat, amikor objektummodellt hozok létre egy DBML-fájlból?
Ehhez a speciális forgatókönyvhöz hajtsa végre a következő lépéseket:
A .dbml fájlban módosítsa a tulajdonságot úgy, hogy a jelölőt a IsReadOnly következőre
True
módosítja.Adjon hozzá egy részleges osztályt. Hozzon létre egy konstruktort az írásvédett tagok paramétereivel.
Tekintse át az alapértelmezett UpdateCheck értéket (Never) annak megállapításához, hogy ez-e az alkalmazás megfelelő értéke.
Figyelemfelhívás
Ha a Visual Studióban az Objektumrelációs Tervező használja, előfordulhat, hogy felülírja a módosításokat.
APTCA
A System.Data.Linq részben megbízható kóddal van megjelölve?
Igen, a System.Data.Linq.dll szerelvény az attribútummal AllowPartiallyTrustedCallersAttribute megjelölt .NET-keretrendszer szerelvények közé tartozik. E jelölés nélkül a .NET-keretrendszer szerelvények csak teljes mértékben megbízható kóddal használhatók.
A linq-ről SQL-be irányuló elsődleges forgatókönyv a részlegesen megbízható hívók engedélyezéséhez engedélyezni kell a LINQ-ről SQL-szerelvényre való hozzáférést webalkalmazásokból, ahol a megbízhatósági konfiguráció közepes.
Adatok leképezése több táblából
Az entitás adatai több táblából származnak. Hogyan térképre?
Létrehozhat nézetet egy adatbázisban, és megfeleltetheti az entitást a nézetnek. A LINQ to SQL ugyanazt az SQL-t hozza létre a nézetekhez, mint a táblák esetében.
Feljegyzés
A nézetek használata ebben a forgatókönyvben korlátozásokkal rendelkezik. Ez a módszer akkor működik a legbiztonságosabban, ha a mögöttes nézet támogatja a végrehajtott Table<TEntity> műveleteket. Csak Ön tudja, hogy mely műveletekre van szánva. A legtöbb alkalmazás például írásvédett, egy másik nagy szám pedig csak tárolt eljárásokkal hajt végre Create
//Update
Delete
műveleteket a nézeteken.
Kapcsolatkészletezés
Van olyan szerkezet, amely segíthet a DataContext-készletezésben?
Ne próbálja újra felhasználni a példányokat DataContext. Mindegyik DataContext fenntartja az állapotot (beleértve az identitás-gyorsítótárat) egy adott szerkesztési/lekérdezési munkamenethez. Ha az adatbázis aktuális állapota alapján szeretne új példányokat beszerezni, használjon egy új DataContextpéldányt.
Továbbra is használhat mögöttes ADO.NET kapcsolatkészletezést. További információ: SQL Server Csatlakozás ion pooling (ADO.NET).
A második DataContext nem frissül
A DataContext egy példányát használtam értékek tárolására az adatbázisban. Az ugyanazon az adatbázison található második DataContext azonban nem tükrözi a frissített értékeket. Úgy tűnik, hogy a második DataContext-példány gyorsítótárazott értékeket ad vissza.
Ez szándékosan van. A LINQ az SQL-hez továbbra is ugyanazokat a példányokat/értékeket adja vissza, mint az első példányban. Ha frissítéseket készít, optimista egyidejűséget használ. Az eredeti adatok az adatbázis aktuális állapotának ellenőrzésére szolgálnak annak megállapításához, hogy azok valójában változatlanok maradnak. Ha módosult, ütközés lép fel, és az alkalmazásnak meg kell oldania. Az alkalmazás egyik lehetősége, hogy visszaállítja az eredeti állapotot az aktuális adatbázis-állapotra, és újra megpróbálja a frissítést. További információ : A változásütközések kezelése.
Beállíthatja a hamis értéket is ObjectTrackingEnabled , amely kikapcsolja a gyorsítótárazást és a változáskövetést. Ezután minden lekérdezéskor lekérheti a legújabb értékeket.
A SubmitChanges nem hívható írásvédett módban
Amikor írásvédett módban próbálom meghívni a SubmitChanges függvényt, hibaüzenet jelenik meg.
Az írásvédett mód kikapcsolja a környezet változáskövetési képességét.