This presentation by Excella Consulting's Shahed Chowdhuri and Sahil Talwar covers EF Code First Migrations and Lean Enterprise Architecture Design.
Including:
- How we use EF Code First Migrations to keep our developers' databases in sync, automatically deploy updates using TeamCity and work with DB Architects who utilize tools like ER/Studio.
- Real world examples to explain how to combat over engineering in an enterprise application through lean startup principles.
3. TDD (Test Driven Development)
BDD (Behavior Driven Development)
CI (Continuous Integration)
CD (Continuous Delivery)
Introduction
ASP.NET
MVC
DB
Enterprise
Web
Application
Looking for Ways to Improve & Modernize
Motivation behind this design?
Our desire to do the following:
17. Resources
• EF Code First Migrations on MSDN:
– http://msdn.microsoft.com/en-US/data/jj591621
• Web.config & configSource:
– http://wakeupandcode.com/all-your-database-are-belong-to-us/
• PluralSight EF Migrations video tutorial:
– http://pluralsight.com/training/Courses/TableOfContents/efmigrations
34. Professors Classes Students
Departments Advisors Universities
Single Responsibility: Context Per Object
Universities
Departments
Professors Classes
Advisors
Students
Lean Enterprise Architecture (title page)A lean, testable enterprise architecture with a modern client stack
Sponsors
Introduction* We are building an enterprise web application with ASP.NET MVC, following best practices for design, development, testability and deployment.* We were looking for ways to improve and modernize* The motivation behind this design was our desire to do TDD, BDD, CI, CD.
Are you familiar with:ASP.NET MVC?Entity Framework?Code First development?Code First Migrations?(slow-reveal diagram + ask the audience)
Options and AlternativesDatabase-First (EDMX)Model-First (visual designer)Code-First with automatic migrationsCode-First with manual migrations
AgendaAdd models and mapping in codeConnection StringEnable MigrationsUpdate DatabasePush code + Migrate server DBProcess Workflow
3. Enable MigrationsEnable MigrationsConfiguration.csAdd Seed data
4. Update DatabaseUpdate DatabaseRun Seed DataVerify SQLVerify DB
5. Push Code + Migrate Server DBPush code to source controlOther developers pull and Update DatabaseMigrate server DB via migrate.exeUse TeamCity to automate this
6. Process WorkflowProcess WorkflowHandle existing databaseComply with enterprise requirements
Code Walkthrough
Code First Migrations allows:Continuous developmentSynchronization among team membersDatabase versioningServer deployment(diagram with star pattern)
Resources
IntroShahed showed DAL, so I’ll run through DomainFair warning, though…
This is not like the other two parts of the presentation!I won’t show you code…Or specific technologies…at all.Instead, war stories and lesson learned
Using Scrum,
CI, CD…TDD, BDD, and DDD…
But at the same time, some people involved with the project are proponents of…
HEAVYWEIGHT enterprise architecture.To see what I mean, compare layersJokes aside, 1 story of over-engineering causing problems:
When using DDD…blogsDev tried to use best practicesDidn’t check if we had the problems
3 problems: Use of UoW optionalRedundant, as I saidTo top it off: buggy, slow, redundant
Now that’s what I call gold plating!
The second story of the day is about premature optimization. Knuth: “premature optimization is the root of all evil”Optimizing for unproven use case because app is complex, expensive, many dev teamsAutomapper both waysWhat does Bogard know? Wrote != knows domain!
Eventually realized it was gold plating as much as the Repositories were
After unreasonable time, came to our sensesPulled out model into cross cutting layerNo more automapper!!Api has Data Contracts that look nothing like models, so that is a valid exception.
Re: sharing a database context across objects.
Service for every complex objectInjected new DbContext into every serviceProblem with shared sub-objects being accessible in several contexts
Looked to SRP for guidance one per objectNot only does not solve issue, makes it worse by making nearly all db objects sharedAlso creates Repo explosion
Made a store to manage # of servicesRealized shared context problem, this fixes it# of Services = pain to manage and test!Came to realizetoo many services & shared context problemsStore was messy, painful hack
Basically, realized that this is a step beyond gold plating.This is solid gold.
Solved problem by splitting up into non-overlapping domains. Practically, this means 1 service per project team, & no overlapping objects.Anyone heard of bounded contexts…?Original solution proposed by DDD to begin with.Anyway,
We fought against over-engineering and gold plating by using lean startup principles:BuiltMeasured pain; demonstrated to EA proponentsLearned from mistakes, built a solution closer to what we believed would alleviate the problemsRinse & Repeat