LINQ till SQL N-nivå med Web Services
LINQ till SQL är särskilt utformat för användning på mellannivån i ett löst kopplat dataåtkomstlager (DAL), till exempel en webbtjänst. Om presentationsnivån är en ASP.NET webbsida använder LinqDataSource du webbserverkontrollen för att hantera dataöverföringen mellan användargränssnittet och LINQ till SQL på mellannivån. Om presentationsnivån inte är en ASP.NET sida måste både mellannivån och presentationsnivån utföra ytterligare arbete för att hantera serialisering och deserialisering av data.
Konfigurera LINQ till SQL på mellannivån
I en webbtjänst eller ett n-nivåprogram innehåller mellannivån datakontexten och entitetsklasserna. Du kan skapa dessa klasser manuellt, eller genom att använda antingen SQLMetal.exe eller Object Relational Designer enligt beskrivningen någon annanstans i dokumentationen. Vid designtillfället har du möjlighet att göra entitetsklasserna serialiserbara. Mer information finns i How to: Make Entities Serializable (Gör entiteter serialiserbara). Ett annat alternativ är att skapa en separat uppsättning klasser som kapslar in data som ska serialiseras och sedan projicera i dessa serialiserbara typer när du returnerar data i DINA LINQ-frågor.
Sedan definierar du gränssnittet med de metoder som klienterna anropar för att hämta, infoga och uppdatera data. Gränssnittsmetoderna omsluter DINA LINQ-frågor. Du kan använda alla typer av serialiseringsmekanismer för att hantera fjärrmetodanrop och serialisering av data. Det enda kravet är att om du har cykliska eller dubbelriktade relationer i objektmodellen, till exempel mellan kunder och beställningar i northwind-standardobjektmodellen, måste du använda en serialiserare som stöder den. Windows Communication Foundation (WCF) DataContractSerializer stöder dubbelriktade relationer, men xmlSerializer som används med icke-WCF-webbtjänster gör det inte. Om du väljer att använda XmlSerializer måste du se till att objektmodellen inte har några cykliska relationer.
Mer information om Windows Communication Foundation finns i Windows Communication Foundation Services och WCF Data Services i Visual Studio.
Implementera dina affärsregler eller annan domänspecifik logik med hjälp av de partiella klasserna och metoderna på DataContext entitetsklasserna och för att ansluta till LINQ till SQL-körningshändelser. Mer information finns i Implementera affärslogik på N-nivå.
Definiera serialiserbara typer
Klient- eller presentationsnivån måste ha typdefinitioner för de klasser som den kommer att ta emot från mellannivån. Dessa typer kan vara själva entitetsklasserna eller specialklasser som endast omsluter vissa fält från entitetsklasserna för fjärrkommunikation. I vilket fall som helst är LINQ till SQL helt obekymrad över hur presentationsnivån hämtar dessa typdefinitioner. Presentationsnivån kan till exempel använda WCF för att generera typerna automatiskt, eller så kan den ha en kopia av en DLL där dessa typer definieras, eller så kan den bara definiera sina egna versioner av typerna.
Hämta och infoga data
Mellannivån definierar ett gränssnitt som anger hur presentationsnivån kommer åt data. Till exempel GetProductByID(int productID)
, eller GetCustomers()
. På mellannivån skapar metodtexten vanligtvis en ny instans av DataContext, kör en fråga mot en eller flera av dess tabeller. Mellannivån returnerar sedan resultatet som en IEnumerable<T>, där T
är antingen en entitetsklass eller en annan typ som används för serialisering. Presentationsnivån skickar eller tar aldrig emot frågevariabler direkt till eller från mellannivån. De två nivåerna utbyter värden, objekt och samlingar av konkreta data. När den har tagit emot en samling kan presentationsnivån använda LINQ till objekt för att fråga efter den om det behövs.
När du infogar data kan presentationsnivån konstruera ett nytt objekt och skicka det till mellannivån, eller så kan mellannivån konstruera objektet baserat på värden som det tillhandahåller. I allmänhet skiljer sig hämtning och infogning av data i n-nivåprogram inte mycket från processen i 2-nivåprogram. Mer information finns i Köra frågor mot databasen och göra och skicka dataändringar.
Spåra ändringar för Uppdateringar och borttagningar
LINQ till SQL stöder optimistisk samtidighet baserat på tidsstämplar (även namngivna RowVersions) och på ursprungliga värden. Om databastabellerna har tidsstämplar kräver uppdateringar och borttagningar lite extra arbete på antingen mellannivån eller presentationsnivån. Men om du måste använda ursprungliga värden för optimistiska samtidighetskontroller ansvarar presentationsnivån för att spåra dessa värden och skicka tillbaka dem när den gör uppdateringar. Det beror på att ändringar som gjorts i entiteter på presentationsnivån inte spåras på mellannivån. I själva verket utförs den ursprungliga hämtningen av en entitet och den eventuella uppdateringen som görs av den vanligtvis av två helt separata instanser av DataContext.
Ju större antal ändringar som presentationsnivån gör, desto mer komplext blir det att spåra ändringarna och paketera dem tillbaka till mellannivån. Implementeringen av en mekanism för att kommunicera ändringar är helt upp till programmet. Det enda kravet är att LINQ till SQL måste ges de ursprungliga värden som krävs för optimistiska samtidighetskontroller.
Mer information finns i Datahämtning och CUD-åtgärder i N-nivåprogram (LINQ till SQL).