entity framework database and code first
DESCRIPTION
Slide deck presented to LA SQL Developers Group on Thursday, March 15, 2012TRANSCRIPT
Entity FrameworkDatabase and Code
FirstJames Johnson, MVP
Founder and President of the Inland Empire .NET User’s Group
Three time and current Microsoft MVP – CAD
Software developer by day
Serial netrepreneur by night
Who I am
Agenda Entity Framework Database First Code First MVC Scaffolding
Version 4 released with .NET 4.0 New version (4.3) allows for model-first, code-first
or database-first development Maps POCO objects to database objects A collection of things instead of a dataset of rows “things” are the entities
Entity Framework
Why?◦ Adds a layer of abstraction between database and
code◦ DBA can structure database how they want◦ Developer can map to the database how they
want◦ Rename entities for more comfortable use◦ Entity Framework handles the mappings
Entity Framework
Entity Data Model – EDM◦ Deals with the entities and relationships they use
Entities◦ Instance of EntityType
Specification for a data type which includes a key and named set of properties
◦ Represent individual instances of the objects◦ Customer, book, shoe, usergroup◦ Fully typed
Relationships between look up tables are mapped as associations in the EDMX
Entity Framework
csdl◦ Conceptual Schema Definition Language◦ The conceputal schema for the EDM◦ EntityContainer, EntitySet, EntityType definitions
ssdl◦ Store Schema Definition Language◦ Schematic representation of the data store
msl◦ Mapping Specification Language◦ Sits between the csdl and ssdl and maps the
entity properties
Entity Framework
A design pattern to defer initialization until needed
context.ContextOptions.DeferredLoadingEnabled=true;List<Member> members = context.Members.ToList();foreach(var member in members){var memberBooks = member.Books;
}
Entity FrameworkLazy Loading
Use if you will be needing every related entity
List<Member> Members = context.Members.Include(“Books”).ToList();
foreach(var member in members){var memberBooks = member.Books;
}
Entity FrameworkEager Loading
The context is the instance of the entity Passing an entity around to tiers breaks the
context Just like the song, make sure the context remains
the same
Entity FrameworkContexts
public class ModelHelper{ private static Entities _db; public static Entities Entities { get { if(_db == null) _db = new Entities(); return _db; } set { _db = value; } } }private readonly Entities _db = new Entities();
Entity FrameworkContexts
private Member AddMember(Member member, UserGroup group){ member.UserGroups.Add(group); _db.SaveChanges();}
Entity FrameworkContexts
Doesn’t work because group is in a different contextprivate Member AddMember(Member member, UserGroup group){ var newMember = GetMember(member.Id); var newGroup = GetUserGroup(group.Id); newMember.UserGroups.Add(newGroup); _db.SaveChanges();}
Very similar to LINQ to SQL
SelectingMember member = _db.Members.Single(x=>x.Id == id);
Deletingpublic void DeleteMember(Member member){_db.DeleteObject(member);_db.SaveChanges();
}
Entity FrameworkLINQ to Entities
Adding (Inserting)public void AddMember(Member member){ _db.AddToMembers(member)//this will be a list _db.SaveChanges() // of AddTo<Entities>}
Editing (Updating)public void EditMember(Member member){ _db.Members.Attach(new Member{Id=member.Id}); _db.Members.ApplyCurrentValues(member); _db.SaveChanges();}
Entity FrameworkLINQ to Entities
Repository pattern encapsulates code into a separate class Allows for easy changes Can use it to switch database providers or new technologies Stephen Walther – ASP.NET MVC Framework, Sams
◦ stephenwalther.com◦ “Download the code” link
Add the two projects to your solution Add references to your project
Entity FrameworkRepositories
using GenericRepositorypublic class MyController{ private readonly IGenericRepository _repo; private readonly Entities _db;
public MyController() { _repo = new EFGenericRepository.EFGenericRepository(_db);
}}
Entity FrameworkRepositories
_repo.Get<Member>(id); // get
_repo.Edit(member); // edit
_repo.Create(member); // create
_repo.Delete(member); // delete
// listvar list = _repo.List<Member>().Where(x =>
x.Name.Contains(myName));
Entity FrameworkRepositories
Create the database first Build tables and relationships Create Entity Data Model (EDMX) in Visual Studio Look up tables are converted to Associations
Entity FrameworkDatabase First
Entity FrameworkDatabase First
Entity FrameworkDatabase First
Associations representing look up tables
Members_Books UserGroups_Members
Entity FrameworkDemo
Write code without having to define mappings in XML Define objects in POCO No base classes required Enables database persistence with no configuration Can use Data Annotations
◦ Key◦ StringLength◦ Required◦ RelatedTo◦ Etc.
DbContext◦ Primary object to interact with a database using specific model
DbSet<TEntity>◦ Used to perform CRUD against a specific type from the model
Entity FrameworkCode First – The “Magic Unicorn”
Create classes Create Context Create Controller Write code for
◦ Select◦ Add◦ Update◦ Delete
Create Views
Entity FrameworkCode First
By default, creates SQL Express DB◦ <Project>.Models.<Project>Context.mdf
Can switch to SQL Compact
1. NuGet2. Search for SqlServerCompact3. Install
Adds System.Data.SqlServerCe to references
Entity FrameworkDatabases
Add connection string settings to web.config Name needs to match context
Entity FrameworkDatabases
<add name=“UserGroups”connectionString=“Data Source=|DataDirectory|UserGroups.sdf”providerName=“System.Data.SqlServerCe.4.0” />
Run the project UserGroups.sdf will be created
Entity FrameworkDatabases
Modifying the database Add setting to Global.asax
Entity FrameworkDatabases – Keeping Current
Implementation of IDatabaseInitializer Deletes and recreates the database
EF 4.3.1 uses Code First Migrations◦ Enabled by default◦ Adds table __MigrationHistory to database
Only modifies database if model has changed
Entity FrameworkDatabases – Keeping Current
Entity FrameworkDemo
Create MVC project Use NuGet to update EntityFramework Package Manager Console “Install-Package MvcScaffolding”
Entity FrameworkScaffolding
Add Class(es) Build Project
Entity FrameworkScaffolding
Package Manager Console “Scaffold Controller <ClassName>
Entity FrameworkScaffolding
Controller and Views are created
Entity FrameworkScaffolding
-ControllerName◦ UserGroupsController – look for class “UserGroup”◦ UserGroup – creates UserGroupsController
-ModelType◦ Inferred from controller name◦ Can change name of the model if needed
-Project◦ Specify the name of the project in multi-project solutions
-CodeLanguage◦ Specify “cs” or “vb”
-DbContextType◦ Specify the name of the context
Entity FrameworkScaffolding – Other Commands
-Repository◦ Switch. Will generate a repository class for data access
-Area◦ For putting the generated files in a specific MVC Area
-Layout◦ Which layout page to use if not default _Layout.cshtml
-Force◦ Forces overwriting of existing files
-NoChildItems◦ Will only generate the controller, no views, repositories or data
contexts
Entity FrameworkScaffolding – Other Commands
Add connection string settings to web.config Name needs to match context
Entity FrameworkScaffolding
<add name=“UserGroupsScaffoldingContext”connectionString=“Data Source=|DataDirectory|UserGroups.sdf”providerName=“System.Data.SqlServerCe.4.0” />
Run the project Navigate to /UserGroups/ Database is created
Entity FrameworkScaffolding
Scaffold the rest of the classes “Scaffold Controller <ClassName>
Entity FrameworkScaffolding
Run the project Database will be modified with new tables
Entity FrameworkScaffolding
Entity FrameworkScaffolding Relationships
It’s not you, it’s me. Add relationships to your classes
Using virtual allows EF to use Lazy Loading
Entity FrameworkScaffolding Relationships
Run the project again Database is modified
Look up tables are created
Questions
Thank you
Slides are at◦http://slidesha.re/EFScaffolding
Inland Empire .NET User’s Group◦2nd Tuesday of each month◦www.iedotnetug.org
[email protected] @latringo