2. Table of Contents
1. ORM Technologies – Basic Concepts
2. Entity Framework – Overview
3. Database First with EF
4. Reading Data and CRUD operations with EF
5. Code First with EF
Domain Classes and DbContext
6. Migrations in EF
2
4. 4
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
ORM Technologies
7. 7
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
Overview of EF
8. 8
EF: Basic Workflow
2. Write & execute
query over
IQueryable
3. EF generates &
executes an SQL
query in the DB
1. Define the data
model (use a DB
visual designer
or code first)
9. 9
EF: Basic Workflow (2)
5. Modify data
with C# code
and call "Save
Changes"
6. Entity Framework
generates &
executes SQL
command to
modify the DB
4. EF transforms
the query
results into
.NET objects
10. 10
Install Entity Framework through the NuGet package manager
Installing Entity Framework
12. 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
12
13. 13
We can also use extension methods for constructing the query
Find element by id
Reading Data with LINQ Query
using (var context = new SoftUniEntities())
{
var project = context.Projects.Find(2);
Console.WriteLine(project.Name);
}
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
14. 14
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
Creating New Data
var project = new Project()
{
Name = "Judge System",
StartDate = new DateTime(2015, 4, 15)
};
context.Projects.Add(order);
context.SaveChanges(); This will execute an SQL INSERT
Create a new
project object
Mark the object for inserting
15. 15
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
Cascading Inserts
Employee employee = new Employee();
employee.FirstName = "Petya";
employee.LastName = "Grozdarska";
employee.Projects.Add(new Project { Name = "SoftUni Conf" } );
softUniEntities.Employees.Add(employee);
softUniEntities.SaveChanges();
16. 16
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
Updating Existing Data
Employees employee =
softUniEntities.Employees.First();
employees.FirstName = "Alex";
context.SaveChanges(); This will execute
an SQL UPDATE
This will execute an
SQL SELECT to load
the first order
17. 17
Delete is done by Remove() on the specified entity collection
SaveChanges() method performs the delete action in the
database
Deleting Existing Data
Employees employee =
softUniEntities.Employees.First();
softUniEntities.Employees.Remove(employee);
softUniEntities.SaveChanges();
Mark the entity for
deleting at the next save
This will execute the
SQL DELETE command
18. 18
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
Parameter
value
Return
type
21. 21
Create database schema and generate C# code (models) from it
Database First in EF
DB
EDMX
Model
Domain
Classes
22. Code First in EF
Custom
Configuration
DbContext &
ModelBuilder
Domain
classes
As needed
DB
22
23. 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
23
24. 24
Another example of domain class (model)
Domain Classes (Models) (2)
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
25. 25
Defining the DbContext Class
using System.Data.Entity;
using CodeFirst.Models;
public class ForumDbContext : 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
26. CRUD Operations with EF Code First
var db = new ForumDbContext();
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();
26
29. 29
Enable Code First Migrations
Open Package Manager Console
Run Enable-Migrations command
-EnableAutomaticMigrations for auto migrations
Code First Migrations in Entity Framework
30. 30
Configuring the Migration Strategy
// Enable automatic DB migrations for ForumDbContext
Database.SetInitializer(
new MigrateDatabaseToLatestVersion<
ForumDbContext, DbMigrationConfig>());
class DbMigrationConfig :
DbMigrationsConfiguration<ForumDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
}