For three-tier architecture. I would think of doing an abstraction using a domain model model and a data model, and then doing direct EFs from the presentation layer.
So the idea is that you have a data model that has EF POCO classes with repositories that know how to access these classes for different CRUDs.
Your domain model will have models associated with your client (so that you can put various ViewModels or verification-related code), it can be a WPF or MVC web application. Now there is a business between the two that is talking to both Domain models and data.
Your presentation level knows nothing about EF / Layer / Repository. When you want to implement a new database or database, you just need to write new repository classes and data model classes (which may be with some kind of gen code).
It also allows your module to be testable.
source share