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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi