2012-01-23 8 views
6

voglio usare Codice EF prima per un database che sto attualmente accesso utilizzando pianura vecchio ADO.NET con le stored procedure.EF Codice Prima - Mappa dizionario o di tipo personalizzato come un nvarchar

Nel mio database ho alcune colonne nvarchar(MAX) che devono essere mappate su e da un Dictionary<string, string>.

quando viene salvato nel database, è una stringa in formato XML. Io uso questa tecnica per consentire l'internazionalizzazione di ad es. un nome di un prodotto in un negozio online. Non conosco il numero di lingue che un determinato utente desidera tradurre, quindi non posso avere una colonna Name per ogni lingua.

ho anche voluto evitare di memorizzare i valori in una tabella separata, quindi ho finito con il Dizionario - approccio XML.

Il modo in cui lo faccio ora, è quello di trattare un qualsiasi di queste colonne come una stringa ogni volta che interagire con il database. Ho una funzione di mappatura personalizzata che può trasformare l'XML in un dizionario e tornare a XML.

Ma io non riesco a trovare un modo per farlo con il codice EF prima? Qualche idea?

risposta

12

È possibile aggiungere una proprietà che restituirà il valore Dictionary<,> come stringa XML e quindi rimuovere il mapping per la proprietà Dictionary<,>.

[NotMapped] 
    public Dictionary<string,string> MyDictionary 
    { 
    get; set; 
    } 

    public string DictionaryAsXml 
    { 
     get 
     { 
      return ToXml(MyDictionary); 
     } 
     set 
     { 
      MyDictionary = FromXml(value); 
     } 
    } 

Se non si vuole esporre la vostra proprietà DictionaryAsXml un'occhiata a this blog post. Mostra come puoi mantenere proprietà private e protette.

+0

Fantastico! Grazie :) - Non avrei pensato di farlo – Yablargo

+0

Perché XML e non JSON, l'ultimo è più compatto e sarebbe più efficiente in termini di archiviazione DB no? – Piou

+1

@Piou Non riesco a ricordare esattamente cosa stavo pensando cinque anni fa ma immagino di essere ancora più abituato all'XML e poi a JSON. Suppongo che l'esempio funzionerebbe anche con JSON, quindi sentitevi liberi di provarlo. Ricorda tuttavia che l'ottimizzazione prematura è la radice di tutto il male. –

2

ho avuto qualche difficoltà con la conversione di XML in VB.NET. Quindi ho approfittato di newtonsoft.json per serializzare il dizionario su una stringa JSON e viceversa.

Public Property JsonDict As String 
    Get 
     If MyDict Is Nothing Then 
      Return Nothing 
     Else 
      Return JsonConvert.SerializeObject(MyDict) 
     End If 
    End Get 
    Set(value As String) 
     If value Is Nothing Then 
      MyDict = Nothing 
     Else 
      MyDict = JsonConvert.DeserializeObject(Of Dictionary(Of Single, Single))(value) 
     End If 
    End Set 
End Property 
<NotMapped> 
Public Property MyDict As Dictionary(Of Single, Single) 
Problemi correlati