EF Code Firstx

Download Report

Transcript EF Code Firstx

building software to
help our clients grow
SINCE 1985
(How to) Put your Code First
with Entity Framework
Max Weber – Architect
www.tallan.com
We thank the following companies for their gracious sponsorship
Platinum Sponsor
Gold Sponsors
Silver Sponsors
Distribution of slide deck
 This
slide deck will be made available from the
following locations:
 Tallan
blogs - blogs.tallan.com
 Code Camp NYC - nyc.codecamp.us
Our Agenda
 Brief
introduction to Entity Framework (EF)
 Intro to EF Code First
 Talking about, then coding:
 Entities and
Associations
 Adding Metadata / annotations
 Validation
 Database Initializers / seeding / testing
 Inheritance Mapping
 Drawbacks
 Summary
What is Entity Framework? (Abridged)
 Based
 EDM
on the Entity Data Model (EDM)
borrows from Entity-Relationship Model
 Current
version is v4.0 (Shipped with VS2010)
Entity Framework set up shop where?
What is the Entity Data Model?
 Entity
Data Model
 The
Entity Data Model (EDM) is a set of concepts that
describe the structure of data, regardless of its stored
form. The EDM borrows from the Entity-Relationship
Model described by Peter Chen in 1976, but it also
builds on the Entity-Relationship Model and extends its
traditional uses.
 Extensions to E-R Model:

Separation of the entities and relationships from their
storage medium

http://msdn.microsoft.com/en-us/library/ee382825.aspx
Entity Framework’s supply chain
Data Providers – Entity Framework 4
 EF
uses the ADO.NET Data Provider model
 Providers

MS SQL Server






Indirect access to other DBs using ODBC, OLEDB
VistaDB
Devart
OpenLink Software
Synergy
…5+ more
 ADO.NET

Data Providers List
http://msdn.microsoft.com/en-us/data/dd363565.aspx
EF: What comes first?
 Database
First
 Create
model from database
 Designer / XML files
 Model
First
 Create
database from model
 Designer / XML files
 Code
First
 Create
database from model
 Code-only interface
 Available exclusively in “Magic Unicorn” Edition
Magic Unicorns? Seriously?
 Based
on Entity Framework “Magic Unicorn Edition”
(Thanks Scott Hanselman)
 CTP5
– minimal breaking changes left
 Next version: RTW (Q1 2011)
 Version is basically, EF4 SP1 or EF5
 Code
interface instead of XML to EF
How do I land myself a Magical Unicorn?
 NuGet Package
Manager (VS 2010) (recommended)
 Download
extension then install package
“EFCodeFirst”
 Download
 Link

from MSDN
here.
(The link really isn’t presentation-friendly)
What the DbContext?
 DbContext
 Inherits from
ObjectContext
 Lightweight context for database
 DbSet
 Inherits from
ObjectSet
 Lightweight version
 Fewer options to choose from
Convention over Configuration
 public
class MyAppContext : DbContext
 Default
Connection String: “MyAppContext”
 Creates database if one doesn’t exist

Default database order: SQL Express, SQLCE, SQL Server
 DbSet<User>
Users { get; set; }
 Maps
to “Users” table
 Id (int)



Marked as primary key
identity column
Stored as UserId in Users table
Associations
 One-To-Many
 Users have

public virtual ICollection<Post> Posts { get; set; }
 Posts have

many posts
many comments
public ICollection<Comment> Comments { get; set; }
Associations
 One-to-One
 Comments have

an author (User)
public virtual User Author {get; set;}
Associations
 Many-To-Many
 Posts

public virtual ICollection<Tag> Tags { get; set; }
 Tags

can contain many Tags
can be applied to many posts
public virtual ICollection<Post> Posts { get; set; }
Lazy Loading
 Standard
Loading
 public class user

public ICollection<Post> Posts { get; set; }
 Lazy
Loading
 public class User

public virtual ICollection<Post> Posts { get; set; }
Database generation
 Turning
 You
it off
can turn it off
 Database
Initialization (IDatabaseInitializer)
 DropCreateDatabaseAlways
 CreateDatabaseIfNotExists
 DropCreateDatabaseIfModelChanges
 Better
Migration support is supposed to be coming!
Seeding Data
 In your
Database Initializer class:
 protected override
 Useful
void Seed(DatabaseContext context)
for testing
 Specify
connection string + DropCreateDatabaseAlways
= consistency + isolation
Complex Types
 Complex
type = entity with no key
 Automatic registration of a complex type:
 No
key can be inferred through convention
 No primary key annotation / fluent API
 Explicit
registration of a complex type:
 [ComplexType] annotation
 ComplexType<>() Fluent
API
 Restrictions
 Values must be
scalar (no referencing allowed!)
 Must be initialized in parent entity
Overriding Convention
 Examples
 Change database connection string / name
 public CodeBookContext() : base("SocialNotWork")
 Change table names
 [Table("CaptchaType", SchemaName = "sec")]
public class CaptchaTypeTest
 Field mapping
 [Column(Name="CaptchaTypeID", Order=1)]
public int CaptchaID { get; set; }
Validation
 Validation
via ValidationAttribute(s)
 [StringLength]
 [Required]
 [MaxLength]
 [RegularExpression]
 Entity
or ComplexType validation
 Honors
IValidatableObject interface
 Validating
 Context.SaveChanges() invokes automatically
 Get
validation errors with Context.GetValidationErrors()
Data Annotations


Assembly
 System.ComponentModel.
DataAnnotations
Annotations
 Key
 MaxLength
 MinLength
 Column
 StringLength
 InverseProperty
 NotMapped


More Annotations
 ForeignKey
 ConcurrencyCheck
 Required
Class-level
 ComplexType
 Table
Inheritance Mapping
 Impedance
 “is
mismatch: OO vs. Relational design
a” vs. “has a”: Bridge the gap!
 Three
types of Inheritance Mapping
 Table
Per Hierarchy (TPH)
 Table Per Type (TPT)
 Table Per Concrete Class (TPC)
 Which
 That
one should I use?
depends…
Table Per Hierarchy (TPH)
 Table
Per Hierarchy (TPH)
 Use
one table for all types (denormalize schema)
 Class type determined by “Discriminator”

Discriminator value can be overridden for values and data
types
 This
is the default convention
 Cons
 (DBA
starts to yell at you because…)
 Sub-class fields not enforced in database (NOT NULL)
 Violates 3NF

Sub-class values dependent on Discriminator value
Table Per Type (TPT)
 Table
Per Type (TPT)
 Base
table for base class
 One table per derived type (differential)
 Implementation
 Table
annotation on subtypes
 fluent API via ToTable
 Cons
 Ugly
generated SQL when querying for base class
 Reporting more difficult due to normalized structure
Table Per Concrete Class (TPC)
 Table
Per Concrete Class (TPC)
 No
base table for base class
 One table per type contains all information
 No VS2010 EDM designer support; EF runtime support
 Implementation
 One
table per concrete type, no column sharing
 No relationships; database is unaware
 Fluent API: MapInheritedProperties() + ToTable()
 Cons
 Difficult
migration / change process
Inheritance Mapping
 Which
one should I use?
 TPH

Behavior (not structure) is main differentiator of sub-classes
 TPT

Structure (not behavior) is main differentiator of sub-classes
 TPC


Base class rarely/never directly queried (for top level)
Query of concrete objects is high/the norm
 Can
use more than one method in a hierarchy
 TPT vs. TPC – JOIN vs. UNION
We also call these opportunities…
 Drawbacks
 (no)
Stored procedure support
 (no) Generation of classes from existing database
(Code First stack)
 (no) Enums (future release, not in EF at all)
 WCF Data Services hack (not sure if issue still)
 Internationalization conventions (maybe for RTW)
EF4 Code First Workaround ideas
 The
“stored procedure” issue
 Start
out with EF Code First
 Circle the wagon when stored procedures / other
features are needed

Database First, refine model, generate POCO classes
 WCF
Data Services
 Wait
for RTM (if the problem still exists in CTP5)
 Creativity
is key! Share / monetize your ideas!
Summary
 EF:
I have an idea (about what it is)
 EF Code First – code wags database
 Convention over configuration = efficiency +
flexibility
 Inheritance Mapping tackles OO/Relational
impedance mismatch
 Not perfect
 EF Code First not done (as of 2/18)
 Availability by
end of Q1 2011
You can Dig Deeper with these Handy Resources
 Entity
Framework FAQ
 EF Design blog
 ADO.NET team blog
 EF on MSDN Library
 EF on MSDN Data Development Center
 Julie Lerman’s blog
 Scott Guthrie’s blog
 Scott Hanselman’s blog
 Morteza Manavi’s blog
 The Morning Brew (Developer News)
If you remember one thing from this presentation:
Cycling is the new “Golf”
Tallan, Inc. Proprietary and Confidential. Copyright 2010.
7/16/2015
35
WCF Data Services
Bonus Slides Section #1
Architecture Overview :
WCF Data Services
Open Data Protocol (OData)
 Definition
 OData
enables you to expose your data as resources
that are addressable by URIs
 Enables you to access and change data by using the
semantics of representational state transfer (REST)
 Standard HTTP verbs supported:

GET, PUT, POST, DELETE.
Reference: WCF Data Services Overview http://msdn.microsoft.com/library/cc668794.aspx
Output Formats – WCF Data Services
 Atom
 JSON
 XML
Freedom of data source – WCF Data Services
 Entity
Framework Provider
 Uses
Entity Data Models to structure access
 Reflection
Provider
 Exposes data

structures with interface IQueryable
Create/Update/Delete with interface IUpdatable
 Custom
 Roll
 Link
Provider
your own
to WCF Data Services Providers

http://msdn.microsoft.com/en-us/library/dd672591.aspx
Override Configuration
Bonus Slides Section #2
Fluent API: Model Configuration



Primary Keys
 Simple or Composite
Properties
 CLR-Nullable to required
 Override string length
 Switch off identity
 Ignore property
Types
 Complex Type

Relationships








One to Many
Many to One
Turn off cascade delete
Composite foreign key
Rename FK
Rename Many:Many cols
Mapping (Table, Cols)
 Change names
Inheritance

Link to Fluent API page
Changing conventions
 It
can be done
 Factory classes for conventions just need to be
rerouted to other classes (or something)