Entity Framework è uno strumento che facilita l'interrogazione di database e la creazione dell'entità mappate al modello relazionale. Questi oggetti in alcune circostanze di semplificazione dell'architettura possono essere utilizzate direttamente, senza DTO, come oggetti nel Binding dell'interfaccia o essere utilizzate per la realizzazione di un servizio in Windows Communication Foundation.
In questo caso le entità necessitano di essere serializzate mediante il DataContractSerializer perciò valgono tutti i requisiti, attributi e meccanismi di qualsiasi altra classe. In Entity Framework, le classi auto generate dal designer ereditano da EntityObject e sono marcate sia con l'attributo Serializable (runtime serialization), sia con l'attributo DataContract perciò si possono passare, senza alcuna modifica, direttamente al motore di serializzazione. L'attributo ha però impostato la proprietà IsReference a true, perciò le EntityReference e le EntityCollection che l'entità contiene, vengono serializzate una sola volta e tutti i successivi riferimenti, non sono replicati nell'XML di uscita, ma semplicemente referenziati con un attributo XML z:Id. Inoltre, poiché il lazy loading non è presente in Entity Framework, ma richiede un'esplicita chiamata, laddove non viene chiamato il metodo Load dell'EntityReference e EntityCollection viene serializzata soltanto la proprietà EntityKey contenente i valori della chiave.
Ecco un esempio di serializzazione di un ordine del database Northwind:
NorthwindEntities af = new NorthwindEntities();
// Carico il primo ordine
Orders c = af.Orders.First(or => or.Order_Details.Count > 0);
// Carico anche il relativo Customer
c.CustomersReference.Load();
// Creo il serializer
DataContractSerializer serializer = new DataContractSerializer(c.GetType());
// Serializzo l'oggetto
using (XmlWriter writer = XmlWriter.Create(Console.Out))
{
serializer.WriteObject(writer, c);
}Di seguito invece una porzione XML dove si può notare che viene serializzato anche il Customer:
<?xml version="1.0" encoding="ibm850"?> <Orders> <EntityKey xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Data" z:Id="i2" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataC lasses"> <d2p1:EntityContainerName>NorthwindEntities</d2p1:EntityContainerName> <d2p1:EntityKeyValues> <d2p1:EntityKeyMember> <d2p1:Key>OrderID</d2p1:Key> <d2p1:Value xmlns:d5p1="http://www.w3.org/2001/XMLSchema" i:type="d5p1:int">10248</d2p1:Value> </d2p1:EntityKeyMember> </d2p1:EntityKeyValues> <d2p1:EntitySetName>Orders</d2p1:EntitySetName> </EntityKey> <!-- cliente relativo popolato --> <Customers z:Id="i3"> <EntityKey xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.Data" z:Id="i4" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> <d3p1:EntityContainerName>NorthwindEntities</d3p1:EntityContainerName> <d3p1:EntityKeyValues> <d3p1:EntityKeyMember> <d3p1:Key>CustomerID</d3p1:Key> <d3p1:Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:string">VINET</d3p1:Value> </d3p1:EntityKeyMember> </d3p1:EntityKeyValues> <d3p1:EntitySetName>Customers</d3p1:EntitySetName> </EntityKey> <City>Reims</City> <!-- tagliato --> </Customers> <!-- cliente relativo --> <CustomersReference xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> <!-- chiave referenziata --> <d2p1:EntityKey xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.Data" z:Ref="i4" /> </CustomersReference> <!-- employee relativo non caricato --> <Employees i:nil="true" /> <!-- employee relativo --> <EmployeesReference xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> <d2p1:EntityKey xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.D ata" z:Id="i5"> <d3p1:EntityContainerName>NorthwindEntities</d3p1:EntityContainerName> <d3p1:EntityKeyValues> <d3p1:EntityKeyMember> <d3p1:Key>EmployeeID</d3p1:Key> <d3p1:Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1 :int">5</d3p1:Value> </d3p1:EntityKeyMember> </d3p1:EntityKeyValues> <d3p1:EntitySetName>Employees</d3p1:EntitySetName> </d2p1:EntityKey> </EmployeesReference> <Freight>32.3800</Freight> <OrderDate>1996-07-04T00:00:00</OrderDate> <OrderID>10248</OrderID> <!-- tagliato --> </Orders>
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Mischiare codice server side e client side in una query LINQ con Entity Framework
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Usare la libreria PredicateBuilder per eseguire query tramite Entity Framework che usano or su più campi
Loggare le query più lente con Entity Framework
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Eseguire query in contemporanea con EF


