web-dev-qa-db-fra.com

Quelle est l'unité de travail dans EF?

J'apprends EF et j'ai vu de nombreux exemples, et au cours de mon apprentissage, j'ai appris à utiliser le référentiel et les modèles d'unité de travail. J'ai compris pourquoi utiliser le référentiel mais je ne comprends pas vraiment l'unité de travail.

Ne pas comprendre rend la compréhension DAL difficile. Veuillez me guider.

Merci

37
haansi

Le DataContext ou ObjectContext est l'unité de travail.

Ainsi, votre DAL enregistrera, supprimera et récupérera des objets et votre DataContext/ObjectContext gardera une trace de vos objets, gérera les transactions et appliquera les modifications.

Ceci est un exemple juste pour illustrer l'idée de la solution.

using(var context = new ObjectContext()) { // Unit of Work
    var repo = new ProductRepository(context);
    var product = repo.GetXXXXXXX(...);
    ...

    // Do whatever tracking you want to do with the object context. For instance:
    // if( error == false) { 
    //     context.DetectChanges();
    //     context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
    // }
}

Et votre référentiel ressemblera à:

public abstract class Repository {

    public Respository(ObjectContext context){
        CurrentContext = context;
    }

    protected ObjectContext CurrentContext { get; private set; } 
}

public class ProductRespository : Repository {
    public ProductRespository(ObjectContext context) : base(context){
    }

    public Product GetXXXXXX(...){
        return CurrentContext... ; //Do something with the context
    }
}    

Une autre façon consiste à placer l'unité de travail (contexte d'objet) globalement:

Vous devez définir quelle sera la portée de votre unité de travail. Pour cet exemple, ce sera une requête Web. Dans une implémentation du monde réel, j'utiliserais l'injection de dépendance pour cela.

public static class ContextProvider {

    public static ObjectContext CurrentContext {
        get { return HttpContext.Items["CurrentObjectContext"];
    }

    public static void OpenNew(){
        var context = new ObjectContext();
        HttpContext.Items["CurrentObjectContext"] = context; 
    }

    public static void CloseCurrent(){
        var context = CurrentContext;
        HttpContext.Items["CurrentObjectContext"] = null;
        // Do whatever tracking you want to do with the object context. For instance:
        // if( error == false) { 
        //     context.DetectChanges();
        //     context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
        // }
        context.Dispose();
    }
}

Dans cet exemple, ObjectContext est l'unité de travail et il vivra dans la demande actuelle. Dans votre asax global, vous pouvez ajouter:

protected void Application_BeginRequest(object sender, EventArgs e){
    ContextProvider.OpenNew();
}

protected void Application_EndRequest(object sender, EventArgs e){
    ContextProvider.CloseCurrent();
}

Dans vos référentiels, vous appelez simplement ContextProvider.CurrentContext

34
Ivo

L'un des modèles de conception les plus courants dans le développement de logiciels d'entreprise est l'unité de travail . Selon Martin Fowler, le modèle d'unité de travail "maintient une liste des objets affectés par une transaction commerciale et coordonne la rédaction des modifications et la résolution des problèmes de concurrence."

Le modèle d'unité de travail n'est pas nécessairement quelque chose que vous construirez vous-même explicitement , mais le modèle apparaît dans presque tous les outils de persistance que je connais de. L'interface ITransaction dans NHibernate, la classe DataContext dans LINQ to SQL et la classe ObjectContext dans Entity Framework sont tous des exemples d'une unité de travail. Pour cette question, le vénérable DataSet peut être utilisé comme unité de travail .

Pour plus d'informations, veuillez cliquer sur ici pour lire cet article, c'est un bon article.

Pour un didacticiel sur la mise en œuvre du référentiel et des modèles d'unité de travail dans une application ASP.NET MVC (MVC 4 et EF 5) (9 sur 10), cliquez sur ici

Pour le didacticiel EF 6 et MVC 5, cliquez sur ici

J'espère que cela vous aidera, cela m'a aidé!

enter image description here

26
Deep

Unité de travail

Maintient une liste des objets affectés par une transaction commerciale et coordonne la rédaction
hors des changements et de la résolution des problèmes de concurrence.

enter image description here

Lorsque vous extrayez et sortez des données d'une base de données, il est important de garder une trace de ce que vous avez changé; sinon, ces données ne seront pas réécrites dans la base de données. De même, vous devez insérer de nouveaux objets que vous créez et supprimer tous les objets que vous supprimez.

Vous pouvez modifier la base de données à chaque modification de votre modèle d'objet, mais cela peut entraîner de nombreux appels de base de données très petits, ce qui finit par être très lent. De plus, cela vous oblige à avoir une transaction ouverte pour toute l'interaction, ce qui n'est pas pratique si vous avez une transaction commerciale qui s'étend sur plusieurs demandes. La situation est encore pire si vous devez garder une trace des objets que vous avez lus afin d'éviter des lectures incohérentes.

Une unité d'oeuvre assure le suivi de tout ce que vous faites pendant une transaction commerciale qui peut affecter la base de données. Lorsque vous avez terminé, il comprend tout ce qui doit être fait pour modifier la base de données à la suite de votre travail.

http://martinfowler.com/eaaCatalog/unitOfWork.html

14
Matt Ball