Hai bisogno di aiuto con un buon design per molti a uno i rapporti con serializzazione XML in C #

StackOverflow https://stackoverflow.com/questions/4017526

Domanda

Supponendo che ho alcuni dati in forma di

Customer1
 Name
 Address
 Order1
  ID
  Products
   Product1
    ID
   Product2
    ID
Customer2
 ...

Utilizzando la seguente classe di rappresentarla

class Customer
{
 public String name { get; set; }
 public String Address {get; set;}
 public List<OrderInfo> Orders { get; set; }
} 

class Order
{
 public int ID { get; set; }
 public List<Product> Products { get; set; }
}

class Product
{
 public int ID { get; set; }
}

Mi piacerebbe utilizzare la serializzazione XML per leggere / scrivere i dati invece di utilizzare il framework entità e SQL. Con il quadro entità sarei in grado di definire una relazione molti a uno in modo che ogni prodotto viene memorizzato solo una volta nel database e ogni ordine sarebbe solo fare riferimento a esso. Utilizzando il codice precedente con serializzazione XML è la mia comprensione che ci sarebbero molte copie di ciascun prodotto conservato (sia nella memoria e il file XML).

Per correzione che ho potuto solo memorizzare un elenco di ID di prodotto invece che a prodotti stessi e poi basta serializzare una raccolta differenziata dei 'prodotti' a un altro file XML -. Ma non mi sembra una soluzione pulita

Un'altra idea sarebbe quella di avere un RepositoryClass che conteneva un elenco di clienti e prodotti. I clienti sarebbero quindi solo bisogno di memorizzare i productIDs e quando hai richiesto un 'cliente' dal repo sarebbe gestire la ricerca e la costruzione degli oggetti di cui sopra in modo che il resto del mio codice non avrebbe dovuto preoccuparsi di come i dati sono stati memorizzati . Vi sembra una soluzione migliore? Come lo fareste?

L'altro requisito per la soluzione che io voglio il più semplice possibile collegare la soluzione GUI per modificare le proprietà direttamente (che in realtà è il motivo per cui non vi auguro un modo per memorizzare tutto in un file XML che ho potuto solo legarsi a una finestra WPF).

Grazie in anticipo per i vostri pensieri e consigli!

È stato utile?

Soluzione

Non ci sarebbe alcun copie memorizzate nella memoria perché si potrebbe creare un'istanza di un prodotto specifico, una volta e si riferiscono a tale prodotto da quel momento in poi.

Il caso XML è un po 'più complicato. La specifica XML ha una soluzione per questo, ma non sono sicuro di come bene il framework .NET supporta questa. Si potrebbe avere un documento XML in questo modo:

<rootElement>
    <Customers>
        <Customer ...>
            <Order>
                <ProductRef ref="1" />
                <ProductRef ref="2" />
            </Order>
        </Customer>
    </Customers>
    <Products>
        <Product id="1" />
        <Product id="2" />
        <Product id="3" />
        <Product id="4" />
    </Products>
</rootElement>

A convalidare parser XML convalidare Ecco id sono unici all'interno del documento e che ogni attributo ref si riferisce in realtà a un id se si specifica uno schema DTD o XML che richiede questo.

Naturalmente si sarebbe ancora necessario costruire qualcosa che analizza questa struttura, ma non avete più dati XML duplicati.

Altri suggerimenti

Il DataContractDeserializer in .NET ha un argomento del costruttore chiamato preserveObjectReferences. Se questo argomento è impostata su true (il valore predefinito è false) è conservata l'identità degli oggetti. Per maggiori informazioni: http://msdn.microsoft.com/en-us/library /ms731073.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top