ORM Technologies and Entity Framework (EF) Entity Framework, DbContext, CRUD Operations, Code First, Migrations Svetlin Nakov Inspiration Manager Software University http://softuni.bg © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.
Table of Contents ORM Technologies – Basic Concepts Entity Framework – Overview Database First with EF Reading Data and CRUD operations with EF Code First with EF Domain Classes and DbContext Migrations in EF © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.
Introduction to ORM Technologies What is Object-Relational Mapping (ORM)?
ORM Technologies Object-Relational Mapping (ORM) is a programming technique for automatic mapping data and database schema Map relational DB tables to classes and objects ORM creates a "virtual object database" Used from the programming language (C#, Java, PHP, …) ORM frameworks automate the ORM process A.k.a. Object-Relational Persistence Frameworks
Relational database schema ORM Mapping – Example ORM Entities (C# classes) Relational database schema ORM Framework
Object-Relation Persistence Framework for .NET Entity Framework (EF) Object-Relation Persistence Framework for .NET
Overview of EF Entity Framework (EF) is the standard ORM framework for .NET Maps relational database to C# object model Powerful data manipulation API over the mapped schema CRUD operations and complex querying with LINQ Database first approach: from database to C# classes Code first approach: from classes to DB schema Visual Studio generates EF data models Data mappings consist of C# classes, attributes and XML
EF: Basic Workflow Define the data model (use a DB visual designer or code first) Write & execute query over IQueryable EF generates & executes an SQL query in the DB
EF: Basic Workflow (2) EF transforms the query results into .NET objects Modify data with C# code and call "Save Changes" Entity Framework generates & executes SQL command to modify the DB
Database First with Entity Framework and Visual Studio Live Demo
Entity Framework – Components The DbContext class DbContext holds the DB connection Holds and DbSet<T> for the entity classes Provides LINQ-based data access ( through IQueryable) Provides API for CRUD operations Entity classes Hold entities (objects with their attributes and relations) Each database table is typically mapped to a single C# entity class © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.
Reading Data with LINQ Query We can also use extension methods for constructing the query Find element by id using (var context = new SoftUniEntities()) { var employees = context.Employees .Select(c => c.FirstName) .Where(c => c.JobTitle == "Design Engineering") .ToList(); } This is called projection ToList() method executes the SQL query This is called selection using (var context = new SoftUniEntities()) { var project = context.Projects.Find(2); Console.WriteLine(project.Name); }
Creating New Data To create a new database row use the method Add(…) of the corresponding collection: SaveChanges() method executes the SQL insert / update / delete commands in the database var project = new Project() { Name = "Judge System", StartDate = new DateTime(2015, 4, 15) }; context.Projects.Add(order); context.SaveChanges(); Create a new project object Mark the object for inserting This will execute an SQL INSERT
Cascading Inserts We can also add cascading entities to the database: This way we don't have to add Project individually They will be added when the Employee entity (employee) is inserted to the database Employee employee = new Employee(); employee.FirstName = "Petya"; employee.LastName = "Grozdarska"; employee.Projects.Add(new Project { Name = "SoftUni Conf" } ); softUniEntities.Employees.Add(employee); softUniEntities.SaveChanges();
Updating Existing Data DbContext allows modifying entity properties and persisting them in the database Just load an entity, modify it and call SaveChanges() The DbContext automatically tracks all changes made on its entity objects Employees employee = softUniEntities.Employees.First(); employees.FirstName = "Alex"; context.SaveChanges(); This will execute an SQL SELECT to load the first order This will execute an SQL UPDATE
Deleting Existing Data Delete is done by Remove() on the specified entity collection SaveChanges() method performs the delete action in the database Mark the entity for deleting at the next save Employees employee = softUniEntities.Employees.First(); softUniEntities.Employees.Remove(employee); softUniEntities.SaveChanges(); This will execute the SQL DELETE command
Parameter placeholder Native SQL Queries var context = new SoftUniEntities(); string nativeSQLQuery = "SELECT FirstName + ' ' + LastName " + "FROM dbo.Employees WHERE JobTitle = {0}"; var employees = context.Database.SqlQuery<string>( nativeSQLQuery, "Marketing Specialist"); foreach (var emp in employees) { Console.WriteLine(emp); } Parameter placeholder Return type Parameter value
CRUD Operations with EF Live Demo
"Code First" Approach in EF From Classes to DB Schema
Database First in EF Create database schema and generate C# code (models) from it Domain Classes DB EDMX Model
DbContext & ModelBuilder Code First in EF Domain classes DbContext & ModelBuilder DB Custom Configuration As needed © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.
Domain Classes (Models) Bunch of normal C# classes (POCO) May hold navigation properties public class PostAnswer { public int Id { get; set; } public string Content { get; set; } public int PostId { get; set; } public virtual Post Post { get; set; } } Primary key Foreign key Navigation property Virtual for lazy loading
Domain Classes (Models) (2) Another example of domain class (model) public class Post { public Post() this.Answers = new HashSet<PostAnswer>(); } public virtual ICollection<PostAnswer> Answers { get; set; } public PostType Type { get; set; } This prevents NullReferenceException Navigation property Enumeration
Defining the DbContext Class using System.Data.Entity; using CodeFirst.Models; public class ForumContext : DbContext { public DbSet<Category> Categories { get; set; } public DbSet<Post> Posts { get; set; } public DbSet<PostAnswer> PostAnswers { get; set; } public DbSet<Tag> Tags { get; set; } } Put all entity classes as DbSets
CRUD Operations with EF Code First var db = new ForumContext(); var category = new Category { Name = "Database course" }; db.Categories.Add(category); var post = new Post(); post.Title = "Homework Deadline"; post.Content = "Please extend the homework deadline"; post.Type = PostType.Normal; post.Category = category; post.Tags.Add(new Tag { Text = "homework" }); post.Tags.Add(new Tag { Text = "deadline" }); db.Posts.Add(post); db.SaveChanges(); © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.
"Code First" Approach in EF Live Demo
Using Code First Migrations in EF
Code First Migrations in Entity Framework Enable Code First Migrations Open Package Manager Console Run Enable-Migrations command -EnableAutomaticMigrations for auto migrations
Using Code First Migrations in EF Live Demo
ORM Technologies and Entity Framework (EF) https://softuni.bg © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.
Free Trainings @ Software University Software University Foundation – softuni.org Software University – High-Quality Education, Profession and Job for Software Developers softuni.bg Software University @ Facebook facebook.com/SoftwareUniversity Software University @ YouTube youtube.com/SoftwareUniversity Software University Forums – forum.softuni.bg © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.