Partager via


Activités d'entités

Cette rubrique s'applique à Windows Workflow Foundation 4.

Cet exemple montre comment utiliser ADO.NET Entity Framework avec Windows Workflow Foundation pour simplifier l'accès aux données.

ADO.NET Entity Framework permet aux développeurs d'utiliser des données sous forme d'objets spécifiques au domaine, de propriétés et de relations, telles Customers, Orders, Order Details et les relations entre ces entités. Pour ce faire, ADO.NET Entity Framework fournit un niveau d'abstraction qui permet la programmation sur un modèle d'application conceptuel au lieu d'une programmation directe sur un schéma de stockage relationnel. Pour plus d'informations sur le sujet suivant ADO.NET Entity Framework, consultez ADO.NET Entity Framework.

Détails de l'exemple

Cet exemple utilise la base de données Northwind et inclut des scripts pour la création et la suppression de la base de données Northwind (Setup.cmd et Cleanup.cmd). Les projets dans cet exemple incluent un Entity Data Model basé sur la base de données Northwind. Vous pouvez rechercher le modèle en ouvrant le fichier Northwind.edmx inclus dans le projet. Il s'agit du modèle qui définit la forme des objets accessibles à l'aide d'ADO.NET Entity Framework.

Les activités suivantes sont incluses dans cet exemple :

  • EntitySQLQuery : l'activité EntitySQLQuery vous permet de récupérer des objets de la base de données selon une chaîne de requête Entity SQL. Entity SQL est un langage indépendant du stockage qui est similaire à SQL et vous permet de spécifier des requêtes selon le modèle conceptuel et les entités qui font partie du modèle ou du domaine. Pour plus d'informations sur le sujet suivant le langage Entity SQL, consultez Langage Entity SQL.

  • EntityLinqQuery : cette activité vous permet de récupérer des objets de la base de données selon une requête LINQ ou un prédicat.

  • EntityAdd : l'activité EntityAdd vous permet d'ajouter une entité ou une collection d'entités à la base de données.

  • EntityDelete : l'activité EntityDelete vous permet de supprimer une entité ou une collection d'entités de la base de données.

  • ObjectContextScope : les activités indiquées précédemment peuvent être utilisées uniquement dans une instance d'activité ObjectContextScope contenant. L'activité ObjectContextScope configure la connexion à la base de données. Elle requiert une chaîne de connexion (passée ou récupérée à l'aide d'un paramètre de fichier de configuration). L'activité ObjectContextScope facilite l'exécution d'un groupe d'opérations connexes sur les entités. Étant donné que cette portée gère une connexion active, il s'agit d'une portée de non-persistance. De plus, lorsque l'activité ObjectContextScope s'arrête, toutes les modifications apportées aux objets récupérés à l'aide des activités d'entités dans cette portée sont automatiquement rendues persistantes dans la base de données, et aucune action explicite ou suivante n'est requise pour enregistrer les objets dans la base de données.

Utilisation des activités d'entités

Les extraits de code suivants montrent comment utiliser les activités d'entités présentées dans cet exemple.

EntitySql

L'extrait de code ci-dessous montre comment interroger tous les clients dans Londres triés par nom et comment effectuer une itération au sein de la liste de clients.

Variable<IEnumerable<Customer>> londonCustomers = new Variable<IEnumerable<Customer>>();
DelegateInArgument<Customer> iterationVariable = new DelegateInArgument<Customer>();

// create and return the workflow
return new ObjectContextScope
{
    ConnectionString = new InArgument<string>(connStr),
    ContainerName = "NorthwindEntities",
    Variables = { londonCustomers },
    Body = new Sequence
        {
            Activities = 
                {             
                    new WriteLine { Text = "Executing query" },                          
                    // query for all customers that are in london 
                    new EntitySqlQuery<Customer>
                    {
                        EntitySql =  @"SELECT VALUE Customer 
                                        FROM NorthwindEntities.Customers AS Customer 
                                        WHERE Customer.City = 'London' 
                                        ORDER BY Customer.ContactName",
                        Result = londonCustomers
                    },

                    // iterate through the list of customers and display them 
                    new ForEach<Customer>
                    {                                    
                        Values = londonCustomers,
                        Body = new ActivityAction<Customer>
                        {
                            Argument = iterationVariable,
                            Handler = new WriteLine 
                            { 
                                  Text = new InArgument<String>(e =>  
                                              iterationVariable.Get(e).ContactName) 
                            }
                        }
                    }
                }
        }               
};   

EntityLinqQuery

L'extrait de code ci-dessous montre comment interroger tous les clients dans Londres et comment effectuer une itération au sein de la liste résultante de clients.

Variable<IEnumerable<Customer>> londonCustomers = new Variable<IEnumerable<Customer>>() { Name = "LondonCustomers" };
DelegateInArgument<Customer> iterationVariable = new DelegateInArgument<Customer>() { Name = "iterationVariable" };

return new ObjectContextScope
{
    ConnectionString = new InArgument<string>(connStr),
    ContainerName = "NorthwindEntities",
    Variables = { londonCustomers },
    Body = new Sequence
    {
        Activities = 
        {             
            // return all the customers that match with the provided Linq predicate
            new EntityLinqQuery<Customer>
            { 
                Predicate = new LambdaValue<Func<Customer, bool>>(
                          ctx => new Func<Customer, bool>(c => c.City.Equals("London"))),                            
                Result = londonCustomers
            },

            // iterate through the list of customers and display in the console
            new ForEach<Customer>
            {                                    
                Values = londonCustomers,
                Body = new ActivityAction<Customer>
                {
                    Argument = iterationVariable,
                    Handler = new WriteLine 
                    { 
                        Text = new InArgument<String>(e => 
                                      iterationVariable.Get(e).ContactName) 
                    }
                }
            }
        }
    }
};

EntityAdd

L'extrait de code ci-dessous montre comment ajouter un enregistrement OrderDetail à un Order existant.

Variable<IEnumerable<Order>> orders = new Variable<IEnumerable<Order>>();
Variable<IEnumerable<OrderDetail>> orderDetails = new Variable<IEnumerable<OrderDetail>>();
Variable<Order> order = new Variable<Order>();
Variable<OrderDetail> orderDetail = new Variable<OrderDetail>();            

return new ObjectContextScope
{
    Variables = { order, orders, orderDetail, orderDetails },
    ContainerName = "NorthwindEntities",
    ConnectionString = new InArgument<string>(connStr),                
    Body = new Sequence
    {                    
        Activities = 
        {                          
           // get the order where we want to add the detail
           new EntitySqlQuery<Order>
           {
               EntitySql =  
                    @"SELECT VALUE [Order]
                      FROM NorthwindEntities.Orders as [Order]
                      WHERE Order.OrderID == 10249",
               Result = orders
           },

           // store the order in a variable
           new Assign<Order> 
           {
               To = new OutArgument<Order>(order),
               Value = new InArgument<Order>(c => orders.Get(c).First<Order>())
           },
           
           // add the detail to the order
           new EntityAdd<OrderDetail>
           {
               Entity = new InArgument<OrderDetail>(c => 
                                         new OrderDetail { 
                                                  OrderID=10249, ProductID=11, 
                                                  Quantity=1, UnitPrice = 15, 
                                                  Discount = 0, Order = order.Get(c) })
           }
        }
    }
};

EntityDelete

L'extrait de code ci-dessous montre comment supprimer un enregistrement OrderDetail existant dans un Order (s'il existe).

Variable<IEnumerable<OrderDetail>> orderDetails = new Variable<IEnumerable<OrderDetail>>();            

return new ObjectContextScope
{
    Variables = { orderDetails },
    ConnectionString = new InArgument<string>(connStr),
    ContainerName = "NorthwindEntities",
    Body = new Sequence
    {
        Activities = 
        {             
            // find the entitiy to be deleted (order detail for product 11 in order 10249)
            new EntitySqlQuery<OrderDetail>
            {
                EntitySql = @"SELECT VALUE OrderDetail
                                FROM NorthwindEntities.OrderDetails as OrderDetail
                               WHERE OrderDetail.OrderID == 10249 
                                 AND OrderDetail.ProductID == 11",
                Result = orderDetails
            },

            // if the order detail is found, delete it, otherwise, display a message
            new If
            {
                Condition = new InArgument<bool>(c=>orderDetails.Get(c).Count() > 0),
                Then = new Sequence
                { 
                    Activities = 
                    {                                    
                        new EntityDelete<OrderDetail>
                        {
                            Entity = new InArgument<OrderDetail>(c => 
                                              orderDetails.Get(c).First<OrderDetail>())
                        },
                    }
                },                            
                Else = new WriteLine { Text = "Order Detail for Deleting not found" }                            
            }                                                
        }
    }
};

Pour utiliser cet exemple

Vous devez créer la base de données Northwind dans votre instance SQL Server Express locale avant d'exécuter cet exemple.

Pour configurer la base de données Northwind

  1. Ouvrez une invite de commandes.

  2. Dans la nouvelle fenêtre d'invite de commandes, accédez au dossier EntityActivities\CS.

  3. Tapez setup.cmd et appuyez sur ENTRÉE.

Pour exécuter l'exemple

  1. À l'aide de Visual Studio 2010, ouvrez le fichier solution EntityActivities.sln.

  2. Pour générer la solution, appuyez sur F6.

  3. Pour exécuter la solution, appuyez sur CTRL+F5.

Après avoir exécuté cet exemple, vous pouvez supprimer la base de données Northwind.

Pour désinstaller la base de données Northwind

  1. Ouvrez une invite de commandes.

  2. Dans la nouvelle fenêtre d'invite de commandes, accédez au dossier EntityActivities\CS.

  3. Tapez cleanup.cmd et appuyez sur ENTRÉE.

Ee622984.Important(fr-fr,VS.100).gif Remarque :
Les exemples peuvent déjà être installés sur votre ordinateur. Recherchez le répertoire (par défaut) suivant avant de continuer.

<LecteurInstall>:\WF_WCF_Samples

Si ce répertoire n'existe pas, rendez-vous sur la page (éventuellement en anglais) des exemples Windows Communication Foundation (WCF) et Windows Workflow Foundation (WF) pour .NET Framework 4 pour télécharger tous les exemples Windows Communication Foundation (WCF) et WF. Cet exemple se trouve dans le répertoire suivant.

<LecteurInstall>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\EntityActivities