entity framework: code first and magic unicorns

Post on 04-Jul-2015

4.502 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Richie Rump

@Jorriss

www.jorriss.net

• 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

• Code First Model

• DbContext

• Fluent API

• Bug Fixes

• Semantic Versioning

Because Entity Framework 4.2 is better than:

Entity Framework 4.1 Service Pack 2 Update 1 Refresh Release To Web Pack

• Code First Migrations

• Data Annotations on non-public properties

• Additional configuration file settings

• Removal of EdmMetadata table

• Bug Fixes

• Added –IgnoreChanges to enable CodeFirstagainst existing database.

• More inevitable bug fixes.

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

Design 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.

Lovingly stolen from Programming Entity Framework: Code First by Julie Lerman and Rowan Miller page 9.

In a word: Nuget

• What does code look like?

• How do we use it?

• Stop! Demo time.

• Convention over configuration

– Database naming

– Primary Key

• SQL Server Express – default database

• dbContext Class

• 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

• 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

[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; }

}

• 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

Data Annotations

Fluent APImodelBuilder.Entity<Order>().Property(p => p.Id).HasColumnName("Order_ID");

[Column("Order_ID")]public int Id { get; set; }

• This time it will work…I swear!

• Expressed via the navigation properties in your classes

public class Order

{

public int Id { get; set; }

public OrderState State { get; set; }

}

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; }}

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; }

}

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; }

}

• New way to interact with EF objects

• Makes interaction with EF MUCH simpler

• Encapsulates existing EF objects such as ObjectContext, ObjectSet and ObjectQuery

• DbContext – Provides facilities querying and persisting object changes.

• DbSet – Represents an entity for CRUD operations

• Change Tracker API and Validation API are other features

EFTestContext context = new EFTestContext();

var query = context.Orders.Where(c => c.PersonID == 22).Include(c => c.State).ToList();

List<Order> orders = context.Orders.ToList();

• Easy way to retrieve an object via the Primary Key.

EFTestContext context = new EFTestContext();Person p = context.People.Find(1);

EFTestContext context = new EFTestContext();Person p = new Person { FirstName = "Testy", LastName = "User" };context.People.Add(p);context.SaveChanges();

EFTestContext context = new EFTestContext();Person p = context.People.Find(1);context.People.Remove(p);context.SaveChanges();

• 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

• To turn Migrations on

• This creates a Migration folder in project

• Creates Configuration.cs file

• Creates __MigrationHistory system table in DB

PM> Enable-Migrations

• “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

• 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?!?!?!!!

• Now in beta

• Install using NugetInstall-Package EntityFramework –Pre

• ENUMS!

• Performance Improvements

• Spatial Data Types

• Table-Valued Functions

• Most features only in .Net 4.5

• Julie Lerman’s Blog

http://thedatafarm.com/blog/

• Rowan Miller’s Blog

http://romiller.com

• Arthur Vicker’s Blog

http://blog.oneunicorn.com

• #efhelp on twitter

• StackOverflow (of course)

• PluralSite – Julie Lerman’s EF videos

Richie Rump

@Jorriss

http://jorriss.net

http://dotnetmiami.com

top related