Download full Modern Data Access with Entity Framework Core: Database Programming Techniques for .NET, .NET Core, UWP, and Xamarin with C# 1st Edition Holger Schwichtenberg ebook all chapters
Download full Modern Data Access with Entity Framework Core: Database Programming Techniques for .NET, .NET Core, UWP, and Xamarin with C# 1st Edition Holger Schwichtenberg ebook all chapters
com
OR CLICK BUTTON
DOWNLOAD NOW
https://textbookfull.com/product/biota-grow-2c-gather-2c-cook-loucas/
textboxfull.com
https://textbookfull.com/product/pro-c-7-with-net-and-net-core-andrew-
troelsen/
textboxfull.com
https://textbookfull.com/product/beginning-visual-studio-for-mac-
build-cross-platform-apps-with-xamarin-and-net-core-alessandro-del-
sole/
textboxfull.com
https://textbookfull.com/product/pro-c-8-with-net-core-3-foundational-
principles-and-practices-in-programming-ninth-edition-andrew-troelsen/
textboxfull.com
Holger Schwichtenberg
While the advice and information in this book are believed to be true
and accurate at the date of publication, neither the authors nor the
editors nor the publisher can accept any legal responsibility for any
errors or omissions that may be made. The publisher makes no
warranty, express or implied, with respect to the material contained
herein.
Note You’ll see other case studies used in some chapters, such
as the task management app MiracleList.
The World Wide Wings use case deals with the following entities :
Flights between two places where the places were deliberately
not modeled as separate entities but as strings (this simplifies
the understanding of many examples).
Passengers flying on a flight.
Employees of the airline, who have supervisors who are also
employees.
Pilots as a specialization of employees. A flight has only one
pilot. There are no copilots at World Wide Wings .
Persons as a collection of common characteristics for all people
in this example. A person is not available on their own, but only
in one of three specializations: passenger, employee, and pilot.
In the object-oriented sense, therefore, Person is an abstract
base class that cannot own instances but is used only for
inheritance.
The World Wide Wings use case has two data models, explained
here:
The slightly simpler model version 1 (see Figures 2 and 3 ) is
the result of classic relational database design with
normalization. The object model is created by reverse
engineering.
Figure 2. World Wide Wings data model in the simpler version 1
Figure 3. Object model of the World Wide Wings data model in the simpler
version 1
Note The object models that were created in this book for the
data models do not represent an ideal object model because
Entity Framework Core does not support some mapping
capabilities, such as N:M mapping, yet.
The object model for the data schema of World Wide Wings
version 6.1 (Figure 3 ) was automatically generated by the Entity
Framework Core from the database (through reverse
engineering); I deliberately did not change it, even if some of the
generated names are ugly.
In model version 2, there are only the Passenger and Employee
tables for these four entities. Entity Framework Core is currently
somewhat limited and does not support table per type mapping (a
separate table for each class). Therefore, the table Passenger also
includes all the characteristics of Person . In addition to the
Person properties, the Employee table includes the properties of
the Employee and Pilot entities. In the table, a Discriminator
column distinguishes between records that are an employee and
those that are a pilot. Entity Framework Core mixes the concepts of
table by concrete type (TPC) and table by hierarchy (TPH). The
developer has no definite influence on the inheritance mapping in
Entity Framework Core 1. x /2.0. The classic Entity Framework offers
more options here.
The following are the extra dependencies in model version 2:
A Flight belongs to Airline (there will be only World Wide
Wings and its subsidiary Never Come Back Airline in this book).
There a Copilot entity here, but it is optional.
A Flight can optionally have an AircraftType object
assigned. AircraftType must have an
AircraftTypeDetail object.
Each Person and therefore each Pilot and Passenger must
own a Persondetail object.
In this book, both data models are used, partly in modified form,
to show certain scenarios (for example, database schema
migrations).
using System;
using System.Runtime.InteropServices;
using System.Web;
using ITVisions.UI;
using System.Diagnostics;
namespace ITVisions
{
/// <summary>
/// Helper utilities for Console UIs
/// (C) Dr. Holger Schwichtenberg 2002-2018
/// </summary>
public static class CUI
{
public static bool IsDebug = false;
public static bool IsVerbose = false;
}
public static void Headline(string s)
{
Print(s, ConsoleColor.Yellow);
}
public static void HeaderFooter(string s)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(s);
Console.ForegroundColor = ConsoleColor.Gray;
}
/// <summary>
/// Print with Thread-ID
/// </summary>
public static void PrintWithThreadID(string s,
ConsoleColor c = ConsoleColor.White)
{
var ausgabe = String.Format("Thread #{0:00} {1:}:
{2}", System.Threading.Thread.CurrentThread.ManagedThreadId,
DateTime.Now.ToLongTimeString(), s);
CUI.Print(ausgabe, c);
}
/// <summary>
/// Print with time
/// </summary>
public static void PrintWithTime(object s,
ConsoleColor c = ConsoleColor.White)
{
CUI.Print(DateTime.Now.Second + "." +
DateTime.Now.Millisecond + ":" + s);
}
#endregion
/// <summary>
/// Output to console, trace and file
/// </summary>
/// <param name="s"></param>
[DebuggerStepThrough()]
private static void PrintInternal(object s,
ConsoleColor? frontcolor = null, ConsoleColor? backcolor =
null)
{
if (s == null) return;
if (HttpContext.Current != null)
{
try
{
if (frontcolor != null)
{
HttpContext.Current.Response.Write("<span
style='color:" + frontcolor.Value.DrawingColor().Name +
"'>");
}
if
(!HttpContext.Current.Request.Url.ToString().ToLower().Contai
ns(".asmx") &&
!HttpContext.Current.Request.Url.ToString().ToLower().Contain
s(".svc") &&
!HttpContext.Current.Request.Url.ToString().ToLower().Contain
s("/api/")) HttpContext.Current.Response.Write(s.ToString() +
"<br>");
if (frontcolor != null)
{
HttpContext.Current.Response.Write("</span>");
}
}
catch (Exception)
{
}
}
else
{
object x = 1;
lock (x)
{
ConsoleColor altefrontcolor =
Console.ForegroundColor;
ConsoleColor alteHfrontcolor =
Console.BackgroundColor;
Console.WriteLine(s);
Console.ForegroundColor = altefrontcolor;
Console.BackgroundColor = alteHfrontcolor;
}
}
}
#endregion
Listing 1 Class CUI with Subroutines for Screen Output to the Console
The figures that appear in this book are available for download as
well, which will allow you to see them in a larger, color format.
Now that you have been introduced to the plan for the book, the
mock company I’ll be using, and the location for all the code, let’s
get started on your Entity Framework Core learning journey!
Thank you for reading my book, and I welcome any comments
and feedback at EFCoreBookFeedback@dotnet-doctor.net .
Table of Contents
Chapter 1:Introducing Entity Framework Core
Supported Databases
High-Priority Features
NuGet Packages
Generating Code
NuGet Packages
Data Types
Relationships (Master-Detail)
Inheritance
Primary Key
Examples
Base Class
Constructor
Seeing an Example
Thread Safety
Convention vs.Configuration
Field Lengths
Primary Keys
1:1 Relationships
Indexes
Sequential Configuration
Structuring by Subroutines
ef.exe
Add-Migration
Update-Database
Script-Migration
Migration Scenarios
More Options
Context Class
LINQ Queries
Use of var
Repository Pattern
Projections
Challenge:Migrations
Conditions (where)
Contains (in)
Sorts (orderby)
* * *
Ainsi, à chacun des moments de sa durée, le nom de Guermantes,
considéré comme un ensemble de tous les noms qu’il admettait en lui,
autour de lui, subissait des déperditions, recrutait des éléments
nouveaux, comme ces jardins où à tout moment des fleurs à peine en
bouton et se préparant à remplacer celles qui se flétrissent déjà se
confondent dans une masse qui semble pareille, sauf à ceux qui n’ont
pas toujours vu les nouvelles venues et gardent dans leur souvenir
l’image précise de celles qui ne sont plus.
Plus d’une des personnes que cette matinée réunissait, ou dont elle
m’évoquait le souvenir, me donnait les aspects qu’elle avait tour à tour
présentés pour moi, par les circonstances différentes, opposées, d’où
elle avait, les unes après les autres, surgi devant moi, faisait ressortir
les aspects variés de ma vie, les différences de perspective, comme un
accident de terrain, de colline ou château, qui, apparaissant tantôt à
droite, tantôt à gauche, semble d’abord dominer une forêt, ensuite
sortir d’une vallée, et révéler ainsi au voyageur des changements
d’orientation et des différences d’altitude dans la route qu’il suit. En
remontant de plus en plus haut, je finissais par trouver des images
d’une même personne séparées par un intervalle de temps si long,
conservées par des «moi» si distincts, ayant elles-mêmes des
significations si différentes, que je les omettais d’habitude quand je
croyais embrasser le cours passé de mes relations avec elles, que
j’avais même cessé de penser qu’elles étaient les mêmes que j’avais
connues autrefois et qu’il me fallait le hasard d’un éclair d’attention
pour les rattacher, comme à une étymologie, à cette signification
primitive qu’elles avaient eue pour moi. Mlle Swann me jetait, de l’autre
côté de la haie d’épines roses, un regard dont j’avais dû, d’ailleurs,
rétrospectivement retoucher la signification, qui était du désir. L’amant
de Mme Swann, selon la chronique de Combray, me regardait derrière
cette même haie d’un air dur qui n’avait pas non plus le sens que je lui
avais donné alors, et ayant, d’ailleurs, tellement changé depuis, que je
ne l’avais nullement reconnu à Balbec dans le Monsieur qui regardait
une affiche, près du Casino, et dont il m’arrivait une fois tous les dix
ans de me souvenir en me disant: «Mais c’était M. de Charlus, déjà,
comme c’est curieux.» Mme de Guermantes au mariage du Dr
Percepied, Mme Swann en rose chez mon grand-oncle, Mme de
Cambremer, sœur de Legrandin, si élégante qu’il craignait que nous ne
le priions de nous donner une recommandation pour elle, c’étaient,
ainsi que tant d’autres concernant Swann, Saint-Loup, etc., autant
d’images que je m’amusais parfois, quand je les retrouvais, à placer
comme frontispice au seuil de mes relations avec ces différentes
personnes, mais qui ne me semblaient, en effet, qu’une image, et non
déposée en moi par l’être lui-même, auquel rien ne la reliait plus. Non
seulement certaines gens ont de la mémoire et d’autres pas (sans aller
jusqu’à l’oubli constant où vivent les ambassadeurs de Turquie), ce qui
leur permet de trouver toujours—la nouvelle précédente s’étant
évanouie au bout de huit jours, ou la suivante ayant le don de
l’exorciser—de la place pour la nouvelle contraire qu’on leur dit. Mais
même à égalité de mémoire, deux personnes ne se souviennent pas
des mêmes choses. L’une aura prêté peu d’attention à un fait dont
l’autre gardera grand remords, et, en revanche, aura saisi à la volée
comme signe sympathique et caractéristique une parole que l’autre
aura laissé échapper sans presque y penser. L’intérêt de ne pas s’être
trompé quand on a émis un pronostic faux abrège la durée du souvenir
de ce pronostic et permet d’affirmer très vite qu’on ne l’a pas émis.
Enfin, un intérêt plus profond, plus désintéressé, diversifie les
mémoires, si bien que le poète, qui a presque tout oublié des faits
qu’on lui rappelle, retient une impression fugitive. De tout cela vient
qu’après vingt ans d’absence on rencontre, au heu de rancunes
présumées, des pardons involontaires, inconscients, et, en revanche,
tant de haines dont on ne peut s’expliquer (parce qu’on a oublié à son
tour l’impression mauvaise qu’on a faite) la raison. L’histoire même des
gens qu’on a le plus connus, on en a oublié les dates. Et parce qu’il y
avait au moins vingt ans qu’elle avait vu Bloch pour la première fois,
Mme de Guermantes eût juré qu’il était né dans son monde et avait été
bercé sur les genoux de la duchesse de Chartres quand il avait deux
ans.
Et combien de fois ces personnes étaient revenues devant moi, au
cours de leur vie dont les diverses circonstances semblaient présenter
les mêmes êtres, mais sous des formes et pour des fins variées; et la
diversité des points de ma vie par où avait passé le fil de celle de
chacun de ces personnages avait fini par mêler ceux qui semblaient le
plus éloignés, comme si la vie ne possédait qu’un nombre limité de fils
pour exécuter les dessins les plus différents. Quoi de plus séparé, par
exemple, dans mes passés divers, que mes visites à mon oncle
Adolphe, que le neveu de Mme de Villeparisis cousine du Maréchal, que
Legrandin et sa sœur, que l’ancien giletier ami de Françoise, dans la
cour! Et aujourd’hui tous ces fils différents s’étaient réunis pour faire la
trame ici du ménage Saint-Loup, là jadis du jeune ménage Cambremer,
pour ne pas parler de Morel et de tant d’autres dont la conjonction
avait concouru à former une circonstance, si bien qu’il me semblait que
la circonstance était l’unité complète et le personnage seulement une
partie composante. Et ma vie était déjà assez longue pour qu’à plus
d’un des êtres qu’elle m’offrait je trouvasse dans des régions opposées
de mes souvenirs un autre être pour le compléter. Aux Elstir que je
voyais ici en une place qui était un signe de la gloire maintenant
acquise, je pouvais ajouter les plus anciens souvenirs des Verdurin, des
Cottard, la conversation dans le restaurant de Rivebelle, la matinée où
j’avais connu Albertine, et tant d’autres. Ainsi un amateur d’art à qui on
montre le volet d’un retable se rappelle dans quelle église, dans quel
musée, dans quelle collection particulière, les autres sont dispersés (de
même qu’en suivant les catalogues des ventes ou en fréquentant les
antiquaires, il finit par trouver l’objet jumeau de celui qu’il possède et
qui fait avec lui la paire, il peut reconstituer dans sa tête la prédelle,
l’autel tout entier). Comme un seau, montant le long d’un treuil, vient
toucher la corde à diverses reprises et sur des côtés opposés, il n’y
avait pas de personnage, presque pas même de choses ayant eu place
dans ma vie, qui n’y eût joué tour à tour des rôles différents. Une
simple relation mondaine, même un objet matériel, si je le retrouvais
au bout de quelques années dans mon souvenir, je voyais que la vie
n’avait pas cessé de tisser autour de lui des fils différents qui finissaient
par le feutrer de ce beau velours pareil à celui qui, dans les vieux
parcs, enveloppe une simple conduite d’eau d’un fourreau d’émeraude.
Ce n’était pas que l’aspect de ces personnes qui donnait l’idée de
personnes de songe. Pour elles-mêmes la vie, déjà ensommeillée dans
la jeunesse et l’amour, était de plus en plus devenue un songe. Elles
avaient oublié jusqu’à leurs rancunes, leurs haines, et pour être
certaines que c’était à la personne qui était là qu’elles n’adressaient
plus la parole il y a dix ans, il eût fallu qu’elles se reportassent à un
registre, mais qui était aussi vague qu’un rêve où on a été insulté on
ne sait plus par qui. Tous ces songes formaient les apparences
contrastées de la vie politique où on voyait dans un même ministère
des gens qui s’étaient accusés de meurtre ou de trahison. Et ce songe
devenait épais comme la mort chez certains vieillards, dans les jours
qui suivaient celui où ils avaient fait l’amour. Pendant ces jours-là on ne
pouvait plus rien demander au président de la République, il oubliait
tout. Puis si on le laissait se reposer quelques jours, le souvenir des
affaires publiques lui revenait, fortuit comme celui d’un rêve.
Parfois ce n’était pas en une seule image qu’apparaissait cet être si
différent de celui que j’avais connu depuis. C’est pendant des années
que Bergotte m’avait paru un doux vieillard divin, que je m’étais senti
paralysé comme par une apparition devant le chapeau gris de Swann,
le manteau violet de sa femme, le mystère dont le nom de sa race
entourait la duchesse de Guermantes jusque dans un salon: origines
presque fabuleuses, charmante mythologie de relations devenues si
banales ensuite, mais qu’elles prolongeaient dans le passé comme en
plein ciel, avec un éclat pareil à celui que projette la queue étincelante
d’une comète. Et même celles qui n’avaient pas commencé dans le
mystère, comme mes relations avec Mme de Souvré, si sèches et si
purement mondaines aujourd’hui, gardaient à leurs débuts leur premier
sourire, plus calme, plus doux, et si onctueusement tracé dans la
plénitude d’une après-midi au bord de la mer, d’une fin de journée de
printemps à Paris, bruyante d’équipages, de poussière soulevée, et de
soleil remué comme de l’eau. Et peut-être Mme de Souvré n’eût pas
valu grand’chose si on l’eût détachée de ce cadre, comme ces
monuments—la Salute par exemple—qui, sans grande beauté propre,
font admirablement là où ils sont situés, mais elle faisait partie d’un lot
de souvenirs que j’estimais à un certain prix, «l’un dans l’autre», sans
me demander pour combien exactement la personne de Mme de Souvré
y figurait.
Une chose me frappa plus encore chez tous ces êtres que les
changements physiques, sociaux, qu’ils avaient subis, ce fut celui qui
tenait à l’idée différente qu’ils avaient les uns des autres. Legrandin
méprisait Bloch autrefois et ne lui adressait jamais la parole. Il fut très
aimable avec lui. Ce n’était pas du tout à cause de la situation plus
grande qu’avait prise Bloch, ce qui, dans ce cas, ne mériterait pas
d’être noté, car les changements sociaux amènent forcément des
changements respectifs de position entre ceux qui les ont subis. Non;
c’était que les gens—les gens, c’est-à-dire ce qu’ils sont pour nous—
n’ont plus dans notre mémoire l’uniformité d’un tableau. Au gré de
notre oubli, ils évoluent. Quelquefois nous allons jusqu’à les confondre
avec d’autres: «Bloch, c’est quelqu’un qui venait à Combray», et en
disant Bloch c’était moi qu’on voulait dire. Inversement, Mme Sazerat
était persuadée que de moi était telle thèse historique sur Philippe II
(laquelle était de Bloch). Sans aller jusqu’à ces interversions, on oublie
les crasses que l’un vous a faites, ses défauts, la dernière fois où on
s’est quitté sans se serrer la main et, en revanche, on s’en rappelle une
plus ancienne, où on était bien ensemble. Et c’est à cette fois plus
ancienne que les manières de Legrandin répondaient dans son
amabilité avec Bloch, soit qu’il eût perdu la mémoire d’un certain
passé, soit qu’il le jugeât prescrit, mélange de pardon, d’oubli,
d’indifférence qui est aussi un effet du Temps. D’ailleurs, les souvenirs
que nous avons les uns des autres, même dans l’amour, ne sont pas les
mêmes. J’avais vu Albertine me rappeler à merveille telle parole que je
lui avais dite dans nos premières rencontres et que j’avais
complètement oubliée. D’un autre fait enfoncé à jamais dans ma tête
comme un caillou elle n’avait aucun souvenir. Nos vies parallèles
ressemblaient aux bords de ces allées où de distance en distance des
vases de fleurs sont placés symétriquement, mais non en face les uns
des autres. A plus forte raison est-il compréhensible que pour des gens
qu’on connaît peu on se rappelle à peine qui ils sont, ou on s’en
rappelle autre chose, mais de plus ancien, que ce qu’on en pensait
autrefois, quelque chose qui est suggéré par les gens au milieu de qui
on les retrouve, qui ne les connaissent que depuis peu, parés de
qualités et d’une situation qu’ils n’avaient pas autrefois mais que
l’oublieux accepte d’emblée.
Sans doute la vie, en mettant à plusieurs reprises ces personnes sur
mon chemin, me les avait présentées dans des circonstances
particulières qui, en les entourant de toutes parts, m’avaient rétréci la
vue que j’avais eue d’elles, et m’avait empêché de connaître leur
essence. Ces Guermantes mêmes, qui avaient été pour moi l’objet d’un
si grand rêve, quand je m’étais approché d’abord de l’un d’eux,
m’étaient apparus sous l’aspect, l’une d’une vieille amie de grand’mère,
l’autre d’un monsieur qui m’avait regardé d’un air si désagréable à midi
dans les jardins du casino. (Car il y a entre nous et les êtres un liséré
de contingences, comme j’avais compris, dans mes lectures de
Combray, qu’il y en a un de perception et qui empêche la mise en
contact absolue de la réalité et de l’esprit.) De sorte que ce n’était
jamais qu’après coup, en les rapportant à un nom, que leur
connaissance était devenue pour moi la connaissance des Guermantes.
Mais peut-être cela même me rendait-il la vie plus poétique de penser
que la race mystérieuse aux yeux perçants, au bec d’oiseau, la race
rose, dorée, inapprochable, s’était trouvée si souvent, si naturellement,
par l’effet de circonstances aveugles et différentes, s’offrir à ma
contemplation, à mon commerce, même à mon intimité, au point que,
quand j’avais voulu connaître Mlle de Stermaria ou faire faire des robes
à Albertine, c’était, comme aux plus serviables de mes amis, à des
Guermantes que je m’étais adressé. Certes, cela m’ennuyait d’aller chez
eux autant que chez les autres gens du monde que j’avais connus
ensuite. Même, pour la duchesse de Guermantes, comme pour
certaines pages de Bergotte, son charme ne m’était visible qu’à
distance et s’évanouissait quand j’étais près d’elle, car il résidait dans
ma mémoire et dans mon imagination. Mais enfin, malgré tout, les
Guermantes, comme Gilberte aussi, différaient des autres gens du
monde en ce qu’ils plongeaient plus avant leurs racines dans un passé
de ma vie où je rêvais davantage et croyais plus aux individus. Ce que
je possédais avec ennui, en causant en ce moment avec l’une et avec
l’autre, c’était du moins celles des imaginations de mon enfance que
j’avais trouvées le plus belles et crues le plus inaccessibles, et je me
consolais en confondant, comme un marchand qui s’embrouille dans
ses livres, la valeur de leur possession avec le prix auquel les avait
cotées mon désir.
Mais pour d’autres êtres, le passé de mes relations avec eux était
gonflé de rêves plus ardents, formés sans espoir, où s’épanouissait si
richement ma vie d’alors, dédiée à eux tout entière, que je pouvais à
peine comprendre comment leur exaucement était ce mince, étroit et
terne ruban d’une intimité indifférente et dédaignée où je ne pouvais
plus rien retrouver de ce qui avait fait leur mystère, leur fièvre et leur
douceur.
* * *
* * *
Une dame sortit, car elle avait d’autres matinées et devait aller
goûter avec deux reines. C’était cette grande cocotte du monde que
j’avais connue autrefois, la princesse de Nassau. Mis à part le fait que
sa taille avait diminué—ce qui lui donnait l’air, par sa tête située à une
bien moindre hauteur qu’elle n’était autrefois, d’avoir ce qu’on appelle
«un pied dans la tombe»—on aurait à peine pu dire qu’elle avait vieilli.
Elle restait une Marie-Antoinette au nez autrichien, au regard délicieux,
conservée, embaumée grâce à mille fards adorablement unis qui lui
faisaient une figure lilas. Il flottait sur elle cette expression confuse et
tendre d’être obligée de partir, de promettre tendrement de revenir, de
s’esquiver discrètement, qui tenait à la foule des réunions d’élite où on
l’attendait. Née presque sur les marches d’un trône, mariée trois fois,
entretenue longtemps et richement par de grands banquiers, sans
compter les mille fantaisies qu’elle s’était offertes, elle portait
légèrement, comme ses yeux admirables et ronds, comme sa figure
fardée et comme sa robe mauve, les souvenirs un peu embrouillés de
ce passé innombrable. Comme elle passait devant moi en se sauvant
«à l’anglaise», je la saluai. Elle me reconnut, elle me serra la main et
fixa sur moi ses rondes prunelles mauves de l’air qui voulait dire:
«Comme il y a longtemps que nous nous sommes vus, nous parlerons
de cela une autre fois.» Elle me serrait la main avec force, ne se
rappelant pas au juste si en voiture, un soir qu’elle me ramenait de
chez la duchesse de Guermantes, il y avait eu ou non une passade
entre nous. A tout hasard, elle sembla faire allusion à ce qui n’avait pas
été, chose qui ne lui était pas difficile puisqu’elle prenait un air de
tendresse pour une tarte aux fraises et revêtait, si elle était obligée de
partir avant la fin de la musique, l’attitude désespérée d’un abandon
qui toutefois ne serait pas définitif. Incertaine, d’ailleurs, sur la passade
avec moi, son serrement furtif ne s’attarda pas et elle ne me dit pas un
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
textbookfull.com