Najlepszym rozwiązaniem byłoby użycie jednostki Unit of Work do zawinięcia Kontekstu danych, a także do zarządzania czasem życia połączenia i umożliwienia pracy z wieloma repozytoriami (jeśli byłeś skłonny pójść tą ścieżką) .
Podsumowanie realizacji:
- Załóż interfejs (
IUnitOfWork
), który eksponuje właściwości urządzenia DbSet
„s, a także pojedynczy metoda zwana Commit
- Załóż realizacji (
EntityFrameworkUnitOfWork
), wdrażanie jako wymagane. Zatwierdź po prostu wywołaj SaveChanges na klasie bazowej (DbContext
), a także zapewnia dobre wejście dla logiki last minute.
- Kontroler akceptuje
IUnitOfWork
użyj di (najlepiej) w celu rozwiązania EntityFrameworkUnitOfWork
, z HTTP kontekście scoped dożywotnią ustawienie (StructureMap jest dobre dla tego)
- (opcjonalne, ale zalecane) stworzyć repozytorium który również pobiera
IUnitOfWork
i działa, korzystając z kontrolera.
HTH
EDIT - W odpowiedzi na uwagi
Och, jak można to zrobić pracę, która polega na tworzeniu zapisów w wielu modelach wtedy? tj. utwórz nowego użytkownika i nowy post w tej samej transakcji.
Biorąc pod uwagę używanie ASP.NET MVC, kontrolery powinny zaakceptować IUnitOfWork
w swoim konstruktorze.
Oto przykład, w oparciu o co pytasz
public SomeController : Controller
{
private IUnitOfWork _unitOfWork;
private IUserRepo _userRepo;
private IPostRepo _postRepo;
public SomeController(IUnitOfWork unitOfWork, IUserRepo userRepo, IPostRepo postRepo)
{
_unitOfWork = unitOfWork; // use DI to resolve EntityFrameworkUnitOfWork
_userRepo = userRepo;
_postRepo = postRepo;
}
[HttpPost]
public ActionResult CreateUserAndPost(User user, Post post)
{
// at this stage, a HTTP request has come in, been resolved to be this Controller
// your DI container would then see this Controller needs a IUnitOfWork, as well
// as two Repositories. DI smarts will resolve each dependency.
// The end result is a single DataContext (wrapped by UoW) shared by all Repos.
try
{
userRepo.Add(user);
postRepo.Add(post);
// nothing has been sent to DB yet, only two objects in EF graph set to EntityState.Added
_unitOfWork.Commit(); // two INSERT's pushed to DB
}
catch (Exception exc)
{
ModelState.AddError("UhOh", exc.ToString());
}
}
}
I jeszcze jedno pytanie, co robi HTTP kontekst życia lunetą zrobić?
Obiekty DI-talk mieć ustawienia zarządzania, które obejmują zakres od wątku, na sesję, na żądanie HTTP, Singleton, itp
HTTP kontekst jest zawężona zalecana dla aplikacji internetowych. Oznacza to "dodanie kontekstu, gdy przychodzi żądanie HTTP i pozbycie się go po zakończeniu żądania".
Również, gdy używasz UnitOfWork z ORM musisz wziąć pod uwagę, że jeśli commit nie powiedzie się, potrzebujesz nowego Kontekstu/Jednostki Pracy http://lavinski.tumblr.com/post/9114111237/object-relational-mapper -exceptions –