Attività dell'entitàEntity Activities

In questo esempio viene illustrato come utilizzare ADO.NET Entity Framework con Windows Workflow Foundation per semplificare l'accesso ai dati.This sample shows how to use the ADO.NET Entity Framework with Windows Workflow Foundation to simplify data access.

ADO.NET Entity Framework consente agli sviluppatori di usare dati nel formato oggetti, proprietà e relazioni specifici di dominio, quali Customers, Orders, Order Details e le relazioni tra queste entità.The ADO.NET Entity Framework enables developers to work with data in the form of domain-specific objects, properties and relationships such as Customers, Orders, Order Details and the relationships between these entities. A tale scopo, ADO.NET Entity Framework dispone di un livello di astrazione che consente la programmazione in un modello di applicazione concettuale anziché programmando direttamente in uno schema di archiviazione relazionale.The ADO.NET Entity Framework does this by providing a level of abstraction that enables programming against a conceptual application model instead of programming directly against a relational storage schema. Per ulteriori informazioni su ADO.NET Entity Framework, vedere ADO.NET Entity Framework.For more information about the ADO.NET Entity Framework see ADO.NET Entity Framework.

Dettagli dell'esempioSample details

In questo esempio viene usato il database Northwind e sono inclusi script per la creazione e la rimozione di tale database Northwind (Setup.cmd e Cleanup.cmd).This sample uses the Northwind database and includes scripts for creating and removing the Northwind database (Setup.cmd and Cleanup.cmd). I progetti in questo esempio includono un modello Entity Data Model basato sul database Northwind.The projects in this sample include an Entity Data Model based on the Northwind database. Il modello può essere trovato aprendo il file Northwind.edmx incluso nel progetto.You can find the model by opening the Northwind.edmx file that is included in the project. Si tratta del modello che definisce la forma degli oggetti a cui è possibile accedere tramite ADO.NET Entity Framework.This is the model that defines the shape of the objects that can be accessed using the ADO.NET Entity Framework.

In questo esempio sono incluse le attività seguenti:The following activities are included in this sample:

  • EntitySQLQuery: EntitySQLQuery questa attività consente di recuperare oggetti dal database in base a una stringa di query Entity SQL.EntitySQLQuery: The EntitySQLQuery activity allows you to retrieve objects from the database based on an Entity SQL query string. Entity SQL è un linguaggio indipendente dall'archiviazione simile a SQL e consente di specificare query in base al modello concettuale e alle entità che sono parte del modello o del dominio.Entity SQL is a store independent language that is similar to SQL and it allows you to specify queries based on the conceptual model and the entities that are a part of the model or domain. Per ulteriori informazioni sul linguaggio Entity SQL, vedere linguaggio Entity SQL.For more information about Entity SQL Language, see Entity SQL Language.

  • EntityLinqQuery: questa attività consente di recuperare oggetti dal database in base a un predicato o query LINQ.EntityLinqQuery: This activity allows you to retrieve objects from the database based on a LINQ query or predicate.

  • EntityAdd: EntityAdd questa attività consente di aggiungere un'entità o una raccolta di entità al database.EntityAdd: The EntityAdd activity allows you to add an entity or a collection of entities to the database.

  • EntityDelete: EntityDelete questa attività consente di eliminare un'entità o una raccolta di entità dal database.EntityDelete: The EntityDelete activity allows you to delete an entity or a collection of entities from the database.

  • ObjectContextScope: le attività indicate in precedenza possono essere usate solo all'interno di un'istanza dell'attività ObjectContextScope contenitore.ObjectContextScope: The previously mentioned activities can only be used within a containing ObjectContextScope activity instance. L'attività ObjectContextScope imposta la connessione sul databaseThe ObjectContextScope activity sets up the connection to the database. e richiede una stringa di connessione (passata o recuperata usando un'impostazione del file di configurazione).It requires a connection string (that is either passed in or retrieved using a configuration file setting). L'attività ObjectContextScope facilita l'esecuzione di un gruppo di operazioni correlate nelle entità.The ObjectContextScope activity makes it easy to perform a group of related operations on entities. Poiché questo ambito gestisce una connessione attiva, si tratta di un ambito di non persistenza.Because this scope maintains an active connection, it is a No Persist scope. Inoltre, quando l'attività ObjectContextScope viene chiusa, qualsiasi modifica apportata agli oggetti recuperati tramite le attività dell'entità all'interno di tale ambito viene resa persistente nel database, senza dover eseguire alcuna azione esplicita o successiva per un nuovo salvataggio degli oggetti nel database.In addition, when the ObjectContextScope activity exits, any changes that are made to objects retrieved using Entity Activities within that scope automatically get persisted back to the database, and no explicit or subsequent action is required to save objects back to the database.

Utilizzo delle attività dell'entitàUsing the entity activities

Nei frammenti di codice seguenti viene illustrato come usare le attività dell'entità presentate in questo esempio.The following code snippets demonstrate how to use the entity activities presented in this sample.

EntitySqlEntitySql

Nel frammento di codice seguente viene illustrato come eseguire una query su tutti i clienti di Londra ordinati per nome e come scorrere l'elenco dei clienti.The code snippet below shows how to query all customers in London sorted by name and how to iterate through the list of customers.

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)   
                            }  
                        }  
                    }  
                }  
        }                 
};     

EntityLinqQueryEntityLinqQuery

Nel frammento di codice seguente viene illustrato come eseguire una query su tutti i clienti di Londra e come scorrere l'elenco risultante dei clienti.The code snippet below shows how to query all customers in London and how to iterate through the resulting list of customers.

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)   
                    }  
                }  
            }  
        }  
    }  
};  

EntityAddEntityAdd

Nel frammento di codice seguente viene illustrato come aggiungere un record OrderDetail a un ordine esistente.The code snippet below shows how to add an OrderDetail record to an existing Order.

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) })  
           }  
        }  
    }  
};  

EntityDeleteEntityDelete

Nel frammento di codice seguente viene illustrato come eliminare un record OrderDetail esistente in un ordine (se presente).The code snippet below shows how to delete an existing OrderDetail record in an Order (if it exists).

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" }                              
            }                                                  
        }  
    }  
};  

Per usare questo esempioTo use this sample

È necessario creare il database Northwind nell'istanza di SQL Server Express locale prima di eseguire questo esempio.You must create the Northwind database in your local SQL server Express instance before running this sample.

Per impostare il database NorthwindTo set up the Northwind database

  1. Aprire un prompt dei comandi.Open a command prompt.

  2. Nella nuova finestra del prompt dei comandi passare alla cartella EntityActivities\CS.In the new command prompt window, navigate to the EntityActivities\CS folder.

  3. Tipo setup.cmd e premere INVIO.Type setup.cmd and press ENTER.

Per eseguire l'esempioTo run the sample

  1. In Visual Studio 2012Visual Studio 2012 aprire il file della soluzione EntityActivities.sln.Using Visual Studio 2012Visual Studio 2012, open the EntityActivities.sln solution file.

  2. Per compilare la soluzione, premere CTRL+MAIUSC+B.To build the solution, press CTRL+SHIFT+B.

  3. Per eseguire la soluzione, premere CTRL+F5.To run the solution, press CTRL+F5.

Dopo avere eseguito questo esempio, rimuovere il database Northwind.After running this sample, you may want to remove the Northwind database.

Per disinstallare il database NorthwindTo uninstall the Northwind database

  1. Aprire un prompt dei comandi.Open a command prompt.

  2. Nella nuova finestra del prompt dei comandi passare alla cartella EntityActivities\CS.In the new command prompt window, navigate to the EntityActivities\CS folder.

  3. Tipo cleanup.cmd e premere INVIO.Type cleanup.cmd and press ENTER.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

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