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
Generare velocemente pagine CRUD in Blazor con QuickGrid
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Change tracking e composition in Entity Framework
Utilizzare QuickGrid di Blazor con Entity Framework
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Le novità di Entity Framework 8
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Usare le navigation property in QuickGrid di Blazor
Filtering sulle colonne in una QuickGrid di Blazor