Salve a tutti sto incontrando un problema con il mio programma. Ho fatto un programma utilizzando l'approccio modelfirst. Dopo aver sviluppato il mio programma vorrei creare una funzione che mi faccia il backup dei dati contenuti nel database. Per farlo ho pensato di utilizzare XmlSerializer Tengo a precisare che il database e tutto relazionato è che in testa a tutte le tabelle c'è una tabella di partenza. NOn so se mi sono spiegato, cerco di esprimermi con un esempio la tabella1 ha relazione 1 a molti con la tebella2 che ha relazione 1 as molti con la tabella3 e tabella4 e così via. Ottenendo un record della tabella1 ottengo anche tutti gli altri collegati in gerarchia. Perciò il codice che ho utilizzato è il seguente: Dim context As New TerritoriEntities(GetConnectionString) Dim savedialog As New Microsoft.Win32.SaveFileDialog() savedialog.DefaultExt = "xml" savedialog.Filter = "MyFiles Backup (*.xml)|*.hls|All files (*.*)|*.*" Dim risposta = savedialog.ShowDialog If risposta = True Then Dim ObjectStreamWriter As New StreamWriter(savedialog.FileName) Dim textwriter As XmlTextWriter Dim ObjSerializer As New XmlSerializer(GetType(ObjectSet(Of TipologiaTerritorio))) Dim CryptoAlgo As New DESCryptoServiceProvider() Dim Cryptographer As System.Security.Cryptography.CryptoStream CryptoAlgo.BlockSize = 64 CryptoAlgo.KeySize = 64 Dim rgbKey() As Byte = New UnicodeEncoding().GetBytes("MyString") Dim rgbIV() As Byte = New UnicodeEncoding().GetBytes("MyOtherString") Cryptographer = New System.Security.Cryptography.CryptoStream(ObjectStreamWriter.BaseStream, CryptoAlgo.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write) textwriter = New XmlTextWriter(Cryptographer, New System.Text.UTF8Encoding()) ObjSerializer.Serialize(textwriter, context.TipologieTerritorio) textwriter.Close() End If L'ho sempre utilizzato per le liste di classi ma con objectset non funziona in quanto mi da il seguente errore: Per essere XML serializzabili, i tipi che ereditano da IEnumerable devono avere un'implementazone di Add(System.Object) a tutti i livelli della gerarchia di ereditarietà. System.Data.Objects.ObjectSet`1[[HHDLocationSystem.TipologiaTerritorio, HHDLocationSystem, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] non implementa Add(System.Object). Ed in realtà ha ragione in quanto l'oggetto ObjectSet(0f T) non implementa il metodo Add. Perciò sono andato nel designer della classe TerritoriEntities e mi sono accorto che in realtà l'oggetto che io passo al serializer context_TipologiETerritorio (che rappresenta l'ObjectSet) della classe TipologiATerritorio non implementa il metodo Add. Come posso aggirare l'ostacolo. Avevo pensato di passare una lista degli oggetti anzichè l'objectset ma la lista non mi da l'intera gerarchia con tutti i sotto elementi. Altrimenti sarei costretto a creare tante liste quante sono le tabelle(entityset), serializzarle tutte e passarle tutte allo stesso file, e nel recupero separare i dati per lista ed aggiungere una lista per volta in base alla gerarchia. Metodo un pò pasticciato. Un'altra soluzione che avevo pensato era creare una classe bakup che come proprietà avesse delle List delle varie entità di cui voglio fare il bakcup e alla fine fare la serializzazione della classe bacup. Nella deserializzazione poi vado ad aggiungere per ogni objectset le varie liste. Che ne pensate come idea? Potrebbe essere buona o anch'essa un pò pasticciata? Grazie Francesco Valentino
|