dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and Migrations
-
Upload
dotnet-miami -
Category
Technology
-
view
1.337 -
download
1
description
Transcript of dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and Migrations
Entity Framework Code First and Migrations
Richie Rump@Jorriss
www.jorriss.net
Who is this dude?
What is Entity Framework?
• Object-Relational Mapping Framework• Allows developers to retrieve database
data from an object model.• Converts object data into relational data• Uses your classes• Generates SQL
Before Code First…
EF 4.1 – A New Hope
• Code First Model• DbContext• Fluent API
EF 4.2 – Much Ado About Versioning
• Bug Fixes• Semantic VersioningBecause Entity Framework 4.2 is better than:Entity Framework 4.1 Service Pack 2 Update 1 Refresh Release To Web Pack
EF 4.3 – More Like Hibernate
• Code First Migrations• Data Annotations on non-public properties• Additional configuration file settings• Removal of EdmMetadata table• Bug Fixes
EF 4.3.1 – Oops, I Did It Again
• Added –IgnoreChanges to enable CodeFirst against existing database.
• More inevitable bug fixes.
How it all fits
Entity Framework 4.0included with .Net 4.0
EF 4.1 - Code First & DbContext
EF 4.2 – Bug Fixes
EF 4.3 - Migrations
EF 4.3.1 – Bug Fixes
Entity Framework ModelsDesign First Code First
New Database
Existing Database
Model FirstCreate .edmx model in designerGenerate DB from .edmxClasses auto-generate from .edmx
Database FirstReverse engineer .edmx modelClasses auto-generate from .edmx
Code FirstDefine classes & mapping in codeDatabase auto-created at runtime
Code FirstDefine classes & mapping in code
Adapted from Programming Entity Framework: Code First by Julie Learman and Rowan Miller page 3.
So how does this thing work?
Lovingly stolen from Programming Entity Framework: Code First by Julie Lerman and Rowan Miller page 9.
How do I get this thing?
In a word: Nuget
Code First
• What does code look like?• How do we use it?• Stop! Demo time.
Review
• Convention over configuration– Database naming– Primary Key
• SQL Server Express – default database• dbContext Class
Data Annotations
• It’s not enough to use convention.• Tells EF how to map the object model to the
database model.• Place annotations directly against the property
in your class.• System.ComponentModel.DataAnnotations
Common Data Annotations
• Key – Defines a Primary Key• Column – Defines DB column name• Table – Defines table name for a class• Required – Defines a Required DB field• NotMapped – Property not in DB mapping• MinLength() – Min length for a property• MaximumLength() – Max length for property• Range() – Defines a valid value range
Data Annotation - Example [Table(“Product_Order")] public class Order { [Key] [Column("Order_ID")] public int OrderId { get; set; } public DateTime Date { get; set; } public OrderState State { get; set; } public string Item { get; set; } [Range(1, 25)] public int Quantity { get; set; } [MinLength(3, ErrorMessage="What are you thinking?")] [MaxLength(50, ErrorMessage="ERROR!! FAILZ!!!!")] public string Name { get; set; } [NotMapped] public string Note { get; set; } }
Fluent API
• Allows you to configure EF without polluting your classes with annotations.
• Cleaner code• Can have all EF mapping code in one file.• Some things you can only do in the Fluent API
A Comparison
Data Annotations
Fluent APImodelBuilder.Entity<Order>() .Property(p => p.Id).HasColumnName("Order_ID");
[Column("Order_ID")]public int Id { get; set; }
Demo – Fluent API
• This time it will work…I swear!
Relationships: Everyone wants one
• Expressed via the navigation properties in your classes
public class Order
{
public int Id { get; set; }
public OrderState State { get; set; }
}
Fluent API: M:1
Fluent API: M:1
public OrderConfiguration() { ToTable("Order"); Property(p => p.OrderStateID).HasColumnName("Order_State_ID"); HasRequired(p => p.State).WithMany() .HasForeignKey(f => f.OrderStateID); }
public class Order { public int Id { get; set; } public int OrderStateID { get; set; } public OrderState State { get; set; } }
public class OrderState { public int Id { get; set; } }
Fluent API: M:1 with Navigation
Fluent API: M:1 with Navigation
public OrderConfiguration() { ToTable("Order"); Property(p => p.PersonID).HasColumnName("Person_ID"); HasRequired(p => p.SalesPerson).WithMany(t => t.Orders) .HasForeignKey(f => f.PersonID);}
public class Person { public int PersonID { get; set; } ... public List<Order> Orders { get; set; } }
public class Order { public int Id { get; set; } public int PersonID { get; set; } public virtual Person SalesPerson { get; set; } }
Fluent API: M:N
Fluent API: M:N
HasMany(p => p.Items).WithMany(t => t.Orders) .Map(m => { m.ToTable("Order_Item"); m.MapLeftKey("Order_ID"); m.MapRightKey("Item_ID"); });
public class Item { public int Id { get; set; } ... public List<Order> Orders { get; set; } }
public class Order { public int Id { get; set; } ... public List<Item> Items { get; set; } }
DbContext API
• New way to interact with EF objects• Makes interaction with EF MUCH simpler• Encapsulates existing EF objects such as
ObjectContext, ObjectSet and ObjectQuery
DbContext API
• DbContext – Provides facilities querying and persisting object changes.
• DbSet – Represents an entity for CRUD operations
• Change Tracker API and Validation API are other features
Query Examples
EFTestContext context = new EFTestContext();
var query = context.Orders .Where(c => c.PersonID == 22) .Include(c => c.State) .ToList();
List<Order> orders = context.Orders.ToList();
DbContext API
• Easy way to retrieve an object via the Primary Key.
EFTestContext context = new EFTestContext(); Person p = context.People.Find(1);
Add Object
EFTestContext context = new EFTestContext(); Person p = new Person { FirstName = "Testy", LastName = "User" }; context.People.Add(p); context.SaveChanges();
Delete Object
EFTestContext context = new EFTestContext(); Person p = context.People.Find(1); context.People.Remove(p); context.SaveChanges();
Migrations
• Migrations is a new way to generate database changes automatically
• It’s controlled through PowerShell commands• Can migrate forward or rollback DB changes.• Migrations can be handled automatically. EF
will automatically apply change scripts
Enable Migrations
• To turn Migrations on
• This creates a Migration folder in project• Creates Configuration.cs file• Creates __MigrationHistory system table in DB
PM> Enable-Migrations
Add Migration
• “Initial” is the name of the migration• The –IgnoreChanges switch tells EF to create an
empty migration. Use this if this is the first migration and EF did not create the DB.
• Creates a cs file with the changes since the last migration.
• Does not apply changes to DB.
PM> Add-Migration "Inital" -IgnoreChanges
Update Database
• Pushes the migration changes to the DB• Use the –script switch to have EF create a SQL
script of the changes. • Use –TargetMigration to determine end point for
DB. (Rollback/Forward)• Be careful. I wouldn’t run against a production
DB.
PM> Update-Database
Y U NO DO DATABASE RIGHT?!?!?!!!
What’s Next? EF 5.0
• Now in Release Candidate• Install using Nuget
Install-Package EntityFramework –Pre• ENUMS!• Performance Improvements• Spatial Data Types• Table-Valued Functions• Most features only in .Net 4.5
Reference
Other References
• Julie Lerman’s Bloghttp://thedatafarm.com/blog/
• Rowan Miller’s Bloghttp://romiller.com
• Arthur Vicker’s Bloghttp://blog.oneunicorn.com
• #efhelp on twitter• StackOverflow (of course)• PluralSight – Julie Lerman’s EF videos
Thank You!!
Richie Rump@Jorrisshttp://jorriss.nethttp://dotnetmiami.com