When developers start working on any applications (for both web or desktop versions), they spend a long time worrying about the backend database, its tables, and their relationships, stored procedures, views, etc. Along with this, they also need to consider the data schema which will return from the backend part for the application. For this type of operation, we can use many available frameworks such as DAO, RDO, ADO, ADO.NET, Entity Framework, etc. Out of these different frameworks, the most commonly used frameworks are ADO.NET and Entity Framework. So, after reading this article, you will get a clear understanding of the following topics supported with clear examples:
- What is ADO.NET?
- Benefits of ADO.NET.
- Overview of ADO.NET Architecture.
- What is the Entity Framework?
- Differences Between ADO.NET and Entity Framework
- Why we would use ADO.Net.
- Why we would use Entity Framework.
What is ADO.NET?
ADO.NET was invented by Microsoft as a part of the .NET Framework Component. With the help of this technology, we can access any type of data source through our applications and fetch the data to our C# and VB.NET. ADO.NET is a collection of object-oriented-based classes that provide a rich set of data components and with help of these components, we can create high-performance, reliable, and scalable database-based applications. In the ADO.NET models, it connects to the data source only when the system requires reading or updating the data. It is one of the major impacts on application development. Because, in Client-Server or distributed application, always having a connection resource open all the time is one of the most resource-consuming parts. In reality, we don’t need to connect a data source all the time. We only need to connect with a data source when we are reading and writing the data to a data source.
With ADO.NET, we can use SQL queries and stored procedures to perform the read, write, update and delete operation from a data source. We can use the SQL syntax with the help of ADO.NET Command objects and it always returns data in the form of DataReader or DataSet objects. So that, after the connection closes, we can use the DataSet objects to work for the data and after completing the work on our computer, we can connect the data source again when we need to update the data source. A dataset is a container of multiple DataTable Objects and every data table can have a relationship among them. We can access the data source and fill the dataset with the help of data providers. The .NET Framework provides us with three different types of data providers – ADO.NET, OLEDB, and ODBC.
XML plays a major role in ADO.NET. The ADO.NET model utilizes XML to store the data in the cache and transfer the data among applications. Datasets use XML schemas to store and transfer data among applications. We can even use this XML file from other applications without interacting with the actual dataset. We can use data among all kinds of applications and components because XML is an industry standard; we can transfer data via many protocols, such as HTTP, because of XML’s text-based nature.
Why We Use ADO.NET
ADO.NET provides many advantages over the previous Microsoft-based data access technologies like ADO. Some of the major and important advantages are as follows:
- Single Object-Oriented API – ADO.NET always features a single object-oriented collection of classes. ADO.NET also provides different data providers to work with different types of data sources, but the programming model for all the data providers works in the same way. So, if we implement the ADO.NET for one data provider, then after that if we need to change the data provider or use the other data provider, we do not need to change the entire process, we just need to change the class names and connection strings.
- Managed Code – The ADO.NET classes are managed classes. They take all the advantages of .NET CLR, such as language independence and automatic resource management. All .NET languages access the same API. So if we know how to use these classes in C#, we have no problem using them in VB.NET. Another big advantage is we don’t have to worry about memory allocation and freeing it. The CLR will take care of it for us.
- Deployment – In real life, writing database applications using ODBC, DAO, and other previous technologies and deploying on client machines was a big problem that was somewhat taken care of in ADO except that there are different versions of MDAC. Now you don’t have to think about that. Installing distributable .NET components will take care of it.
- XML Support – Today, XML is an industry-standard format and the most widely used method of sharing data among applications over the Internet. In ADO.NET, data is always cached and transferred in XML format. So that, this data can be shared with the application by components and we can transfer data via different protocols such as HTTP for different types of operations.
- Performance and Scalability – When we are developing any web-based application, we always keep focus on two major concerns i.e. Performance and Scalability. Transferring data from one source to another is always a costly process across the Internet due to connection bandwidth limitations and rapidly increasing traffic. Using disconnected cached data in XML takes care of both of these problems.
- DataReader versus DataSet – The ADO.NET DataReader is used to retrieve data in read-only mode (cannot update data back to a data source) and forward-only mode (cannot read backward/random) data from a database. We create a DataReader by calling Command.ExecuteReader after creating an instance of the Command object.
- LINQ to DataSet – LINQ to DataSet API provides queries capabilities on a cached DataSet object using LINQ queries. The LINQ queries are written in C#.
- LINQ to SQL – LINQ to SQL API provides queries against relational databases without using a middle layer database library.
ADO.NET Architecture Concept
Microsoft designed ADO.NET in such a way that we can perform different kinds of data source operations in the same fashion. For simplicity, we can categorize ADO.NET components into three categories: disconnect, common or shared, and the .NET data providers. The disconnected components build based on ADO.NET architecture. We can use these classes with or without data providers. For example, we can use a DataTable object with or without providers, and shared or common components are the base classes for all types of data providers. The below ADO.NET architecture diagram demonstrates related to the ADO.NET Component model and how they work together.
A data provider is a set of factors, similar as Connection, Command, DataAdapter, and DataReader. The Connection is the first element that talks to a data source. With the help of Connection Object, we can establish a connection between the application and the data source. These connection objects work as reference objects in the Command and DataAdapter objects. A Command object executes a SQL query and stored procedures to read, add, update, and cancel data of a data source via a DataAdapter. A DataAdapter is ground between a dataset and the connection. We can use the Command Object to execute any type of SQL Queries and Stored Procedures to fetch data from the database.
All data providers share the ADO.NET common components. These components like DataSet, DataView, and DataViewManager always represent the data on behalf of ADO.NET. The DataSet component objects normally use XML Schema to capture and return data between the Applications and the Data Providers. A DataSet is a sub-set of DataTable objects. A DataTable represents a database table. We can represent single or multiple views of a dataset with the help of DataView and DataViewManager objects. In our applications, if required we can directly use a DataView or DataViewManager component with data-bound controls like DataGrid or DataList.
What Is Entity Framework?
Let’s talk about Entity Framework. Entity Framework is an open-source-based ORM Framework for .NET framework-based applications supported by Microsoft. According to Microsoft documentation, Entity Framework was provided to automate all types of database-related activities for our application. With the help of this framework, developers can access the needed database and start the development work with data with the help of domain-specific class objects. Additionally, they don’t need to focus on the underlying database tables or columns where the actual data will store. Using and understanding the Entity Framework and its structure, developers can work at a higher level of abstraction when they deal with data and can create and maintain the data-oriented application with less code compared with traditional applications.
The following image illustrates where Entity Framework fits into our application:
As the image above shows, the Entity Framework fits between the business entities (domain classes) and the database. It saves data stored in the properties of business entities and also retrieves data from the database and converts it to business entities objects automatically.
Why We Use Entity Framework
Now, let’s see how Entity Framework works. Entity Framework provides many advantages over the previous Microsoft-based data access technologies like ADO.NET. Some of the major and important advantages are as follows:
- Modeling: Entity Framework creates an EDM (Entity Data Model) based on POCO (Plain Old CLR Object) entities with getting/set properties of different data types. Entity Framework uses this EDM-based model class when needed to fetch data or save data to the underlying database.
- Querying: With the help of Entity Framework, we can use LINQ queries (C#/VB.NET) to fetch data from the underlying database. During the processing, the database provider will translate the LINQ queries into the database-specific query language (for example, SQL for a relational database). Also, we can run raw SQL queries directly with the help of Entity Framework for any type of database-based operations.
- Change Tracking: EF keeps track of changes that occurred to instances of your entities (Property values) that need to be submitted to the database.
- Saving: We can execute INSERT, UPDATE, and DELETE commands to the database based on the changes with the help of Entity Framework. These changes will occur to our database only when we executed the SaveChanges() method. Entity Framework also provides the asynchronous SaveChangesAsync() method to perform the database operation asynchronously.
- Concurrency: Entity Framework normally follows the Optimistic Concurrency process model by default. So that it can protect overwriting changes made by another user during the same time interval while data was fetched from the database.
- Transactions: With the help of Entity Framework, we can perform automatic transaction management while querying or saving data throughout the applications. Also, we can customize transaction management with the help of Entity Framework.
- Caching: by default, Entity Framework always provides the first level of data fetching during the Fetch operations. So, while the application sends the repeated query call against the same source of data, then after the first time it will return data from the cache instance instead of hitting the database.
- Built-in Conventions: Entity Framework always follows the standard conventions over the configuration programming pattern, and also, we can include a set of default rules which automatically configure the EF model.
- Configurations: Using Entity Framework, we can configure the EF Models with the help of using annotation attributes or Fluent API to override default conventions related to the validation or data rule.
- Migrations: Entity Provides also provides a set of migration commands which we can execute on the NuGet Package Manager Console or the Command Line Interface to perform different database schema base operations like create a table, update a table structure, or drop any column, etc.
Entity Framework Architecture
Let’s give a short overview of the different components available under the Entity Framework Architecture:
- EDM (Entity Data Model): Entity Data Model or EDM are divided into three main parts – Conceptual model, Mapping and Storage model.
- Conceptual Model: In Conceptual Model, we normally define the model classes and establish the relations between them. This class-based relationship is independent of the database point of view.
- Storage Model: The storage model mainly contains all the database-related design details like tables, views, stored procedures, and the relationships between different tables objects and their relationship keys. Please, read about table per type vs table per hierarchy, if you want to know more about it.
- Mapping: Mapping components mainly contain the information related to the mapping between the conceptual model and the storage model.
- LINQ to Entities: LINQ-to-Entities (L2E) is a query language. This query language is used to write queries against the object model in the Entity Framework layer. These queries return entities as an output where entities are used mainly from the conceptual model.
- Entity SQL: Entity SQL is another query language, which only available for Entity Framework v1 – v6 . This language tool is quite similar to LINQ to Entities. However, as per the operation point of view, it is a little more complex compared to the L2E.
- Object Service: In Entity Framework Architecture Layer, Object service is the main entry point for fetching data from the database layer. The object service layer is also responsible for the materialization of the data.
- Entity Client Data Provider: The main Objective of the Entity Client Data Provider layer is to convert LINQ-to-Entities or Entity SQL queries into a SQL query which is normally understood by any type of database. It always communicates with the ADO.Net data provider to return data from the database.
- ADO.Net Data Provider: This layer communicates with the database using the standard ADO.NET mechanism.
The following figure shows the overall architecture of the Entity Framework.
To expand your possibilities, you can use this powerful Entity Framework Designer that automates the process.
What is the Difference between ADO.NET and Entity Framework
In this chapter, we are going to explore the difference between traditional ADO.NET and Entity Framework. Although both the ADO.Net and Entity Framework are defined on the basic standard of ActiveX Data Objects to connect relational and non-relational database systems. But despite that, these two have many differences compared to each other. Some of the key differences between ADO.NET and the Entity Framework are as below:
- Performance: ADO.NET is much faster compared to the Entity Framework. Because ADO.NET always establishes the connection directly to the database. That’s why it provides much better performance compared to the Entity Framework. It is because, in Entity Framework, the entity first translates the LINQ queries to SQL and then it processes the query to perform database operations. Also, the Entity Framework consists of a wrapper class for the ADO.Net. Due to this wrapper, the developer can perform the coding much faster in Entity Framework.
- Flexibility: In the case of executing SQL Queries and stored procedures, ADO.NET always provides us much more flexibility and control compared to the Entity Framework. ADO.NET always provides full control over the database we use in applications. The LINQ queries are always resulting in an efficient SQL query because raw SQL queries are always useful. We also need to write down the raw SQL queries whenever we can’t express the query using LINQ.
- Speed of Development: With the help of ADO.NET, we can maintain complete control over the data layer of our applications. We can create the classes and methods from scratch which will help us to establish the communication between the database and the application. It always take some more time and effort to develop the data access layer compared to the Entity Framework. In the case of Entity Framework, data access layer creation is much easier. Because Entity Framework generates the model class and database context classes automatically. In this way, it automatically handles the operation of the database.
- Code Maintainability: Code can be maintained in a better way in Entity Framework. Because, when trying to debug the data access layer in ADO.NET, we can’t find the proper relationship between the model classes. But in Entity Framework, it was maintained, and also we found clear dependency on the storage model with the help of the mapping process.
Both ADO.NET and Entity Frameworks have similar and quite different features. To make the process of comparison easier and to answer numerous questions about them (e.g. “does Entity Framework use ADO.NET?” etc.), we offer a clear comparison table.
ADO.NET vs Entity Framework Comparison Table
So, in this article, we discuss ADO.NET and Entity Framework along with the key differences between them. So, whenever we will start developing any application, we need to take the right decision to choose one of them. If we want to achieve more control over SQL commands and operations with the help of raw SQL Queries, then ADO.NET will be a great choice to start work with. Whereas if we want to develop the application in a much faster way with clear code maintainability, then Entity Framework will be the better choice. But also, we can use both the approaches in a single application, like, Entity Framework for the CRUD-related operations and the ADO.NET for fetching records from the database for the reporting purpose and bulk data-related SQL operations.