C# Entity Framework Core with SQLite - dotnet core 5

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hello everybody in this video we will introduce the use of entity framework it's going to be a video for two different chapters in the book and we're going to learn the benefits of using the entity fragment with ad on it and most of those is because you can actually use class mapping in order to make it work and however the way that you need it so let's actually get started what i want to do i want to do a a simple block application where we can actually be able to save blocks and post because we can have multiple blogs we can have multiple posts per block and we will have one-to-many relationship in that there is an example in microsoft documents talking about that so i want to set it little by little and play around and see the benefit of the strong type inside a database one of the biggest benefits of entity framework is it can actually provision your database that means that depending how you put your data your classes your tables and variables will be created or by reverse if you already have a database into the framework can go to a database can see the structure and then create what it will be the um the classes structure and i want to show you both the scenarios so let's get started as you can see i've already in mt when the new console application but i will always get away from my program css and i will create a new one called model dot cs and in this one we're going to use it we are knowing created a model class we will create a block class and this block will have only properties we have public integer blog again with the get set have a public string url that will be a simple get and set right so it's a simple block class in the same file just to keep it simple we're going to create another class here and let's call this one post so the idea is that any blog can have any quantity of post so let's make that reference here we do the reference with a simple um probably we need to do a little let's do the reference right here public please of course for your delete you need to have the collection generic type post let's call the posts in plural with a simple get and by default it's going to be a new post right so by default any any blog that is going to be created we create a new list of post and we can then do something about it right so that's pretty much where to enter in the post let's have simple information public enter post id will have public title and it will be a stream without getting set and public content straight this will allow us to have the basic post structure now think this about like having your database so imagine that every class will be actually a field so here we are defining that the blog will have a list of posts treat lists of posts will not be a property of the blog but it will be a property of the post reference the vlog itself so here we can actually use dual sample as public integer login with a get another right that will reference a block and that will very much make the one too many collection and because of that we can actually list the block that it belongs with a simple public block block and keeping the same name for consistency here and we do together and center and that will be the basic class classes that we need to implement so as i said before we have the blog class an id and url that blog will have a list of posts that by default is going to be generated and the post will have post id titled content and reference to the blog itself right that's pretty much going to be working now we need to make the provision we need to create our database you can use the sql database that you already have even you can use the database to you have on the cloud you will not create create new one you can do that and to proceed we actually going to use a new nougat package so let me show never nougat website and the one that we wouldn't be looking here and we'll be depending the type of database that you want to use we are going to look for entity framework we have a bunch of those right there so we have and the one that we're going to be using is going to be pretty much the chord element of the entity framework chord will allow us to secure another place and the framework full is for let's say for other windows system through visual studio but let's use the minimized version of framework core and we can use abstraction analyzer designs those are going to be different elements tools is something that we need to install in order to execute the migration and i will explain that in a little and we have database in memory we have a sql server we have several of those and we have one for sql lite now this squad lite what it is is a database that is actually a file and that files is a binary file and that file have a structure of table inside so let's actually use we're going to use this one if you want to use the one for sql server you need to be installing of course the one free signal server as it is reflected right here but in this case let's keep the things a little simple so let's install this one for sqlite i will be copying this let me put my terminal again and i will be adding it in order to have it okay and i need to get back actually because i use preferring that it is home that i was not supposed to i installed version 6 and we need to go to version 5 version 6 at the moment is still in preview and the net framework that we're using right now you don't need five so we need to get back to the version five for that we need to just pretty much go to the version history get the latest version five and now though we have the latest version five we usually start that one and the good thing is we can actually do it on top let me show you that so let me go to the serious project you will see that we have this equilibrium six there let me execute the version 5 actually i probably didn't copy correctly let me check okay there you go version five that's going to be installed and you will see that it still has a 6 preview it will move to version 5 ultimately perfect so now that we have version 5 in there we can actually proceed one things that our classes need to have in order to have the id generated for a per table you need to have we can have the creator for id or having an integer that has the same name as the class with the word id at the end that that way entity framework will be smart enough let's say like that in order to understand what i need to be doing so here we need to do is let's go here at the top let's import our um entity framework and there's actually no system in microsoft and it's a franco core i'm going to install let's keep them again another one let's keep all of this um just for the classes i will create another class called going to be the context the context it will be the element that will define the connection and the structural what it to be doing so here there are two different type of properties that we need to define well and one type and that will be one per table let's say like that so let's have a db set and for this div set we need to send the element or the type let's do the pulse for example and let's call this post it a simple guidance editor um oh yeah i cannot do this right away here sorry i i was telling you that i actually need to create first my class of the context we need to have the context public class and let's call this the same way that microsoft does login context and we want to be extended in a minute this class will came for my database content class there is content inside center represent and let me just read here a session with the database and can be used to query and save instance of your entities and typically you can create classes televised from this context that contain a db set with the entity or the class itself if the properties have a public server they are automatically utilized when they install their by contact is created that means that this is a condom in your table we can override it that we can do other stuff with that but mostly it will allow us to have a database and can use it to query and save instance all my ins all my classes present in there now so we have that let's actually say my oops my dv set so this division pretty much is just premium to create instance of post and we allow us to use link you in order to get assistance what will the system go do in the background and they will actually show you that you want to see it is that the link you query will be transformed in sql queries in this case depending what is the case so we need to have that one and we need to have the one for the blocks and let's call it block simpler and now what we need to do is we actually need to do the connection string for my context and that we need to do it we need to override from the db context the on configuration and i will show you that so we need pretty much to go to pro it's a protected overwrite that is not going to be accessed to anyone because this class itself it's a method that's not using anything and call on configuring this on configuring what it actually can have is a db context option builder let's call this options option and let's say that to those option builder whenever it's configuring we'll pretty much use circulite we install the dependencies for sqlite and we're able to use it if you're using the conserver it will be used sql server so we need to save this then we'll ternary right here and from uc collide the only technology to do is i need to send my option action that actually have my database connection so where you can actually do the way that sql server the connection stream for sqlite is just a data source column and the location of the file that you want to save in this case i want to save it in the same folder so i will not put a con location but you are in a windows computer of course you need to do something like this and pull the rest if you are on of course not to have this one you need to have the add at the beginning just remember that if you're in a in a linux or a mac you you need to put the path something like this right in this case i will use the same context that i have by default so i will use the folder where i am and i will call this my block the sqlite database if you are using a sql server here you need to put your connection restraint of course you need to go through the process to do the options and have the connection string getting from your script think like that in a better scenario but for now let's let's do some related right block dot sqlite and probably let me put this in a new window in a new line perfect just to be able to read it so with these simplex elements we have enough in order to create our database so for that we we need to actually install another dependencies from for a nuget package that dependency will be a global tools one of the cool things about donation actually you you can install that and you can do install tools that want to be available that will expand the net functionality itself one of those um tool is the net ef the the entity framework section right and in order to do it you just need to create you need to execute dotnet tool install global net ef that will add more functionality to our dotnet core application or command line and that will process and install a bunch of stuff i said you can invoke it using the command on the perfect so it was successfully installed so i need to add another package to my in order to make um able to connect and create the database the way that i have in my models and that package will be probably held here we will use the design and then you check the nugget just to verify the version don't do for that don't netcord.design there you go and of course we need to go to version 5 file 7 and that should be here is the sign it should be added to or package reference cool it's right there and i have different runtime that you can see and we'll show you what those actually does and for now in order to proceed we're going to create our database and we will be create and migrate it from our module so one of the thing is you need to keep track of every change that you do to database and when you provision the database the first time or the beginning it's better to have a migration element to do it a migration element is pretty much a script or code that you can actually execute and connect to the database and will be provisioned or will read from that and that's better that is actually outside your main program execution that's why we are not programming like create table and do connection we're not doing that internally and of course we would we want to skip all that right we can actually use our classes knowledge with a little tweaking for the connections with this context will pretty much push the changes to the database so the first thing that we need to do we need to do dotnet ef is the commander we just installed and let's add a new migration and we'll call initial the execute it will start build and you just create the migration as you can see now we have migration folder and this migration have a bunch of stuff that pretty much what it's doing is we'll have everything that needs to be created like for example microsoft create table called blogs is a new table have a blog id that have a url column string integer and all this code that we needed in order to create a table is going to be doing it for us and we have the same for the builder target what it's going to be doing et cetera et cetera et cetera it's actually it's actually really good what is actually doing for us and we can see in the context is they want to execute that but don't worry you need to see that you don't need to worry about this so let's minimize this and now that we have the migration created we can do a simple dotnet ef database update and that will start build if it failed the first hand because like this is that the initialization stream doesn't contain starting index zero let's try it to run it again if it's still failing or she's failing with me let's try just to execute the code.net run they will just secure the program we should see the hello world because we're not doing anything the model is not really attached to the main execution let's do a simple.net build just in case we have building without issues cool and let's try to do again the net ef database update and let's see how it goes okay i haven't if you probably have a typo somewhere let me verify that okay i had a typo in my collection string this one was a self uh two dots semicolon but it actually needs to be an equal sign that was the issue so now that we have the equal sign i already executed my database update is just executed below each that allow me to have the new file here called block c collite in order to see that what i would recommend and probably you can install like uh something for visual studio but for this one i don't know like i want to have it like externally there's a tool like this one called db browser for sqlite and it's really lightweight it is available for windows and for mac os download it install it and i recommend to solve the 64-bit version right you have a windows or get the portable one or even use the one for macos doesn't matter well just have that one there and when you open it you will see something like this right here we need to create open a new database and that database should be able to do what we needed now in my particular case because i have a linux environment here on top of my windows this is just for me what i will be doing is i will copy my block circle light and i will paste it in my mount directory in my frame my windows user my username here and probably should not be showing that but well whatever downloads let's actually put in documents there you go and i hope just copy that one right there so in my windows it's simpler for me just to open it and i will go to my documents that i have somewhere and i will open my blog sqlite as you can see here i have my blogs tabled with blog id as primary key the url as text i have my post with my post id as primary key title content in the blog id blog the as you can see it's reference with this index right that we have right here and is connected to the blocks itself we have the migration history that promotes a little value every time that we have a new migration and we have a local sequence that is actually needed by sqlite in order to execute or generate the next id let's let's say like that right that's just something specific for circulate but we have everything here of course we brought the data everything is empty except with the migration history to actually tell us which file was created and executed with which product version right and the sequence also empty so now that we have that we can actually now use or connections we can actually do use our database right away without any other issue just referring directly to the model so let's go to the program and here the only things that i will be doing is using system link you and let's get rid of this um let's call that using and let's call a bar database equal new we call this how we call this actually the blogging context using the same namespace and there you go main constructor there so that means that i don't need to close the connection i will just having that connection i can use everything so now something really simple let's do console rail line adding a new block with no post and you can use a simple database dot add we can specify what we need to add here but we can use new block directly and the only elements that we need to specify in the blog will be in the url remember the id would be general everybody else and it's called url equal gps example dot com and that's it and after that we just need to save the changes database.save changes and we execute code so let me use clear this dotnet run i need a new blog with no post i'm done just with that if we go back to our browser we can actually do refresh somewhere header or phrase there here um oh i need to do a copy over so let me close the database this is just for me you should be able to see the change so let me just copy the other end where it's supposed to be and i will reopen the same file and there you go i have my example.com with a blog id perfect so i have that one there i can read it i can see like at least the post so we can do let's do let's have a list here and of course to have the list ready we need to use the system generally collections generics collection of the pro generic and singular there you go so i can use blocks equal database that blocks so just with that um we have an issue here what is happening can i explain how to connect time relations to list of love and that should be enough oh they're like oh why it's a method there we go okay and now we can do a for each or we can do a simple block dot for each for every block i will do a simple and let me do a string interpolation here i can use beam and what i'm doing here this actually should we need like this pretty vlog let's call it b you can do a b dot log in and a simple b dot url let's close this one there you go so now with that we just query the block itself and we should be able to print those let me disable this because i don't need to add them anymore it's already there oops okay let me use the secret as you can see it just get executed if i insert a new block and let me use um let's call this i don't know google one let's do uh another one for i don't know so texas college so i will insert two more we already have one i'm going to execute and then i can read every blocks that i have in my blogs a simple data and this actually came from the database directly let me just do an extra copy so i can actually open my db browser and again this is just for me let me close the database i will open it again in your case you should be able just to refresh it and you can see the three blocks are getting there print it this allow me to to query that now one of the queries we can use let's do a console right here and let's do get all blocks for example and let me just comment this out i don't need it anymore and let's do um this one let's put an extra line that's an extra line like that is not the best appropriate let's keep like that and now let's use a cost line and get block with id equal to for example how can we use that well we can use a simple block b equal database blocks and here we can actually now use link you and we can use something like select of the type block and what i need to be selecting here hmm [Music] let's send the block element and we need to have where the block dot what we can do here well we can skip this select little wire and let's call let's call this log2 and let's call this beam used to have a better be that blockading is equal as two so an issue here and where it's coming can i explicitly convert and let's do a simple bar probably this is the lazy one okay and now we can just do a constant grind line and let's do block two dot i have all the extra elements here let me do let me just select i can select here let's get the first element yeah probably and now we can use something like block dot there we go just get the url and it's executed.net run let me actually clear it to show it down that run get other blocks and now we're getting the block q id equal to and we know that the one we equal to is actually the google.com so with those we are able to actually query the database in a really simple way using just link you i know the link is something could be a little trouble and you need a learning group to get it but after you get those you'll see that it's actually really better to get it right so let me just verify is getting the first element because this is going to be like a innumerable so just getting the first element i can actually just cast it right away as a block yes i can so by default it will could be like a list or something like that and i just converted right but now because i know that i just get in the first one i just do the first just to extract that element and i can cast as a lot and if i executed this again i have the same behavior cool so let's now update our information let's actually update the google.com and let's add its own post in there okay so now we know that we can assure a query let's actually do the update and let's update this one specifically so we have the block the one we already have as a block to block with ad2 so what we can do here let's zoom let me do a control gridline right here just to save some space and we can actually put um updating google to something else and we can do something really simple so we can do log2 dot url let's say that we don't want to have this to be different let's do dps dash i don't know let's actually change this to all format.lbc whatever right um i can do to block two dot posts i can add a post and that will allow me just to do a new post um title let's say my new post and let's do my content with very interesting information oh okay if i saved it let's see if actually works well that title doesn't exit the current context model post we have title and we have content yeah it does let me see what i'm doing wrong here give me a second okay everything's actually really simple i'm doing instead of equals i don't know why there you go so now that we allow it to have an impulse that will be added and what i can do here i can add something like that and like or actually i can have an insta with a post let's do a post new post let's call this second post equal new and let's do title second post under the content another relevant content and we should be able just to do blog to post dot add my second post so you can do it just insert here a new instance or if you already have the inside of that particular element you can actually save it so the two different ways to change something there after we have that we just do a database that saves change and we can actually see we can actually skip let's do clear let me just copy this over right here so we can actually see the new url and let's do it dot net run and we get all of them we just get the block with id number two and updated google to something else we change it to rodolfo at yc right but also we added a couple of post we can actually go to here well sorry let me do again my copy we can actually go here let me just close this open again and you can see my second url has changed but now if i will go to post i have two posts with the blog id number two that mean that belongs to the second so that's pretty neat something that we can do here now so we added this and let me just let me comment all this because we don't need i don't need it right now let's play around with this one so we're here we're sending to do this but instead of doing this let's actually do something else let's go for let's print it that's okay and let's do b dot for each actually b dot post dot for each there you go and now we can do something extra let's zoom where we post that we have here we just do grindline with a tab and let's send this string interpolation and i just put the the post title in there there you go so here we'll go through every block and then we'll go to every post and we should be able just to see the post added in the second one because the first and the third doesn't have anyone so let's do a clear let's do a donut run and we should be able to see that hmm okay we're able to print this but then we are not able to get the post why were not able to get the post i'm into a simple download build okay we don't have issues on the run so how this is not making this one what you can do here let me see what is happening if a little simple system grind and let's do b post okay we have a collection okay it will be the tab the one that actually has any shoes somehow he's not doing this one and i'm not sure why he's not doing it so let me pause the video enemy i'm sorry for this guys okay i found out my error sorry for that so the first thing that we need to do in order to pull up the nested data we need to explicitly please specify that we want nested data that way it doesn't came by default so one other thing we need to import or use in the entity framework and when we have the blocks as a list before to create as a list we just need to do the include and we say for every block i want you to bring me the blog.post and i should call this be be dot post there you go that's the way we actually telling that include the post so we can actually go for every post that we have in the blog we can actually guideline that so let's see how it looks like now and there you go the first block doesn't have any second one how the new posts are sent composed and the three won't have that one so that's actually pretty it probably that we can do here is let's do order by let's create this order of the post to be something that we actually need only for every post i want to order by pause dot id by post id if i save this it also allow me to do the 4-ish anymore where we can actually send this one so probably let me try to put the for reach the order at the end no it doesn't allow me to do you can do what you can do here this one bar post equal b dot post order by and then primary post we can actually ready to download the concept so this one what it actually is order number i will post pose let me change this to a list that's why i love this here style post and that will allow me maybe oh wait like this okay we so let's try it again now let me see how i can actually do the order by in a better way let me check my notes right now or we can actually leave it together i look further by the link you and i want to see an ascendant mode all we can do here or thereby yeah that should be pretty much so what is expecting here let me do all in one line again probably can do something like this post order by convert it to a list and fro oh here we go for every element of the list i printed let's see if this actually works why the post id this one is actually two and this will be one let's actually print and let's see what it's actually showing little p dot post id oh somehow my new poles get pushed to second second pulse get pushes to id number one so you actually will do any so we can actually do something like this sorry or we can actually do order by descending probably or the by descending and we should see that the order changes of the post right there there you go so you can actually apply link you on top of that and i know that we i probably showed it through the video i probably shouldn't be doing that but i wanted to show when you have an issue what else you can do you can google information you can read the book you can actually try to change you can try to separate a little bit in order to find where is that actual problem so this allows me now just to have everything together so we able to query every block and the polls that belongs to one particular block and if you want to remove something um it could be like the next step let's actually do it again um let's try let's try now i'm gonna go here let's call this um we can actually get this let's call this block tree let's get the first element from block 3 and we can actually remove an image showing just a simple database that remove my block tree it will save the database after that save changes we should be able let me get all this information and i will create a new method public void let's call this print all right let's press the open right here and we can actually copy this what a fish you have here now i need to be fully ecstatic probably um okay let's have that one right here at the end let's do a simple database dot can i close it how can i change the context well let's build your thing again oh i know what i'm doing wrong sorry for this this one actually not to be outside the using so i need to be outside the main that is the blue one as after here we just put that one right there boom let's copy this because yeah because let's create this one and let's send this to the bottom right i will have print all if i do a simple print all you should be able to see it and i want to print all again right here so we should we print both the first time you have the number three in there the second one you should not have it so let's see how it goes down that run there you go number three is there and in the second one number three is not there anymore you just get deleted with you pull remove you can actually remove anything then we just do a full crowd application we created we read we update it and we deleted element from here and it's actually pretty pretty pretty straightforward and well we have the caveat in the video and some errors here things outside the script but we'll pretty much be able to do and execute everything that we needed whatever it is that we not wanted so that's pretty much the way that we can actually proceed um do i never design it so before i close this let me just create another example let me get back one level so i'm missing my entity framework let me do net new it's called ef sample 2 right let's open this oops i opened both let's open the example too there you go so example tone is a simple hello world as you can see let's build it let's save it perfect let's open my terminal and what i want to do here i will to copy from example1 in this case i want to copy my database how can i call the database called call it block circulite i will copy right here so i have the same database so what i will do now is i will create the set this project doesn't have the model so i want to create the models on top of that and we'll see how easy is actually able to do that and in order to do it we need to solve a couple of things we need to add the net add we need to add the design and we need to add the circulator so now that we have that announce that we have the tools to actually get everything right away then the way that we need it we just need to load or we need to do something really fast so we're going to do a dot net ef and we're going to create a db context scaffold and we pro and we put the direction of a connection string or the file in this case will be data source equal log.sqlite that is in this particular folder and then we need to specify the driver and this case will be microsoft dot entity dt framework core the circulator and with that we should be able to read the existing database and that database just created my blocks as you can see it has a little more element like you have the constructor specified there right the pulse you said being at least actually to as a collection but this is understandable and we have the post there too also we can see the the context and the cons they have the connection string is actually recommend you to remove the connection string and pull a secret or something else but it created the connection string it created in the and the two classes reading from the drivers remember this database was copied for the previous project and that's pretty much he did it and now we can just initialize it and start working with it and we can start reading information without an issue because we just how can i say creator of modules based on a database so in the first program we created tables and the second one we created the model we as projects do you want to use it's up to you whatever is easy for you what i like to use i actually like to create my migrations and i do code first and then do my migrations or changes for example i don't need to have the second one open anymore so let me just close it and here let's say that i will go back to my models and let's say that my posts i want to add something extra there i want to create public string let's call this outer with a get set right and now we need to have the auto right there and we'll use print the name in directly how we accommodate that well first of all we need to do not net ef um migration add and we get a new migration that's called added outdoor for example oh i need to open the project there we go so added outer but that will create a new migration process for me and now so we have that out order actually use the net ef database update i will go and extends my post table to add the outer column now so if i can actually go back here let me close it oh let me just copy over oops copy this one there we go so let me open this one i will open my database again if i go to post now i have an outlet that by default is empty it's it's low right we can actually pull this here and let's do something i don't know all phone for example apply it you can actually do it from here or not it's up to you and how do you want to be i don't know john there you go and we should be able to go here and in the print all we are printed title and let's put it here by let's do pause dot outer all right let's donate run we have an issue because post id 3 doesn't exist anymore and that's why you try to delete something that doesn't exist that's that's pretty much the issue but other than that you can actually see um oh he didn't bring the outer why didn't read the outer oh he didn't break the auto because i added to the ground database itself let me just copy from my document um this one is actually log sqlite let me copy that one over here let me comment my deletion because i don't have it anymore let me recommend this print all because i don't need to print it once let me clear the console so you'll be able to see it dot net run and it didn't work why didn't work always failing from me they didn't not commit anything oh save the table scroll display it [Music] if i refresh this that's formation should be there so why didn't bring my outer now you suppose when i put the poster so it was supposed to actually read my post dot author if there is a string and it's on the database somehow it's no reason it okay i think i know what it is i need to write changes so it was not committed let's say like that right now just write the changes let me clear this let me copy again from there to here and i execute it didn't work either otherwise didn't work either okay it looked like i have a like cash issue i just clear my cash a little bit i just waited and i'm able to see who is actually creating who are the authors so without any change to the code you'll verify that i have the deleted changes to the sqlite file that actually work it and it's showing me that so with that we should be able just to extend it and i know that we've been over an hour now but let me show you something really quick um something that could cause problems and loss of data so let's do something really similar let's duplicate our blocks to be outer let's have the upper id that has the name right and this one instead of having this next one as an id out writing i will have the public outdoor outer okay said and this is an integer right what i'm doing is create a new table i'm doing the connection so an author can have multiple posts and a blog can have multiple posts so we have a weird connection with the post table right well nowhere but sometimes needed so we can actually do something like this and we just need to create a context and explore context here and here will be our temporal right and we can do a new migration and more likely this migration will fail on the net ef migration is added outdoor table we say it will prevent lose data why because we remove [Music] a columnar property here we don't have the outer string name anymore we just have outer id but that's why given that prevention if we do net ef database update it could fail sometimes because ranking constraint and with the foreign key is that our database already have data and we have a one too many relationship from the outdoor to the post so by the file there is no or outer id is not being defined by the file but i i didn't tried it but let me do put it by default is going to be one and let's try to do it again let's see if that actually works it will not because the number one doesn't exist so we should have that foreign key constraint fail right so in that particular case because we are using the best curves of action and because you're in the development environment where you export your data and you import it and you'll be careful in the database size or you can do as simple as remove and after you remove it it's not there anymore you do the migration again the update of course they will do the table structure but your data would be low so be careful about this and it's something that need to be accommodated right but now that we have that let me do a copy to my document folders i will open my download process on how i close it let me open my database tracing documents or my document oops right here and you see that the outer stable is right there you have several indexes and oops and the structures and the data is not there anymore as you can see so this is how it works that's what it is right now so just be careful with that and you can extend your database be careful how you extend it but you have a major change like the one that just did with reference a table with the table already having data and having a foreign key issue there it will the migration will not work right it's something to be need to be accommodated so i will end the video right now um the benefits of the entity framework is actually how it scaffolds everything audios from the code to the database or from the database to the code and it's actually pretty neat it's pretty elegant there's people that don't like it there's people that say there is a performance specifically when there's a big data set but for what we're doing is more than enough and actually help us having that strong typing to help pose a lot in our code so i will upload both documents uh today do you hope that you want to have this and i will a couple of referring documentation that you can actually use for microsoft and and that's it pretty much so i really hope that you like it any question or any doubt as always don't hesitate to reach me happy calling everybody
Info
Channel: Learning with Rodo
Views: 469
Rating: undefined out of 5
Keywords:
Id: HSWXkVSumiE
Channel Id: undefined
Length: 78min 14sec (4694 seconds)
Published: Thu Jul 08 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.