2009-09-20 3 views
6

Ho una tabella di riferimento con tutti i tipi di dati di valore di ricerca controllati per sesso, tipo di indirizzo, tipo di contatto, ecc Molte tabelle hanno molteplici chiavi esterne a questa tabella di riferimentopiù chiavi esterne allo stesso tavolo

anche io avere tabelle di associazione molti-a-molti che hanno due chiavi esterne per la stessa tabella. Sfortunatamente, quando queste tabelle vengono inserite in un modello Linq e il DBML viene generato, SQLMetal non considera i nomi delle colonne di chiavi esterne o i nomi dei vincoli, ma solo nella tabella di destinazione. Così finisco con membri chiamati Reference1, Reference2, ... non molto manutenibili. Esempio:

<Association Name="tb_reference_tb_account" Member="tb_reference" <====== 
    ThisKey="shipping_preference_type_id" OtherKey="id" Type="tb_reference" 
    IsForeignKey="true" /> 
    <Association Name="tb_reference_tb_account1" Member="tb_reference1" <====== 
    ThisKey="status_type_id" OtherKey="id" Type="tb_reference" 
    IsForeignKey="true" /> 

posso andare in DBML e modificare manualmente i nomi dei membri, naturalmente, ma questo vorrebbe dire non posso più di andata e ritorno il mio schema del database. Questa non è un'opzione nella fase attuale del modello, che è ancora in evoluzione. Anche la suddivisione della tabella di riferimento in n tabelle singole non è auspicabile.

Probabilmente posso scrivere uno script eseguito contro l'XML dopo ogni generazione e sostituisce il nome del membro con qualcosa derivato da ThisKey (poiché aderisco a una convenzione di denominazione per questi tipi di chiavi). Qualcuno ha trovato una soluzione migliore a questo problema?

+0

Questo sembra rilevante: http://stackoverflow.com/questions/3736003/sqlmetal-multiple-foreign-keys-pointing-to-one-table-issue – DenNukem

risposta

3

Quindi sono andato lungo il percorso delle classi parziali. Ad esempio, ho aggiunto il seguente membro per indirizzare il primo membro di riferimento nel mio esempio originale:

public partial class tb_account 
{ 
    public tb_reference shipping_preference_reference 
    { 
     get 
     { 
      return this._tb_reference.Entity; 
     } 
     set 
     { 
      this.tb_reference = value; 
     } 
    } 

Questo è tutt'altro che perfetto. Richiede una quantità notevole di codice extra in un modello di grandi dimensioni e dipende dall'ordine in cui gli attributi non cambiano (se un'altra chiave esterna alla tabella di riferimento viene aggiunta alla tabella dell'account, questo membro potrebbe effettivamente puntare a qualcosa di diverso dal preferenza di spedizione). C'è anche un lato positivo. Poiché sto già scrivendo classi parziali per altri scopi, l'aggiunta di questi membri non richiede che io rearchitect l'applicazione.

2

L'attuale strumento di ms per LINQ è un po 'limitato e non sembra che ci saranno molti sforzi per il 2010. Puoi scrivere il tuo generatore di codice, guarda Damien's t4 templates o PLINQO. Ho anche trovatoche potrebbe valere la pena dare un'occhiata.

+0

Grazie per i link interessanti. Ho guardato entrambi: i modelli di Damien non sembrano fare ciò di cui ho bisogno. PLINQO sembra essere più configurabile, ma richiede Codesmith, che non è gratuito. Ho intenzione di provare un approccio con classi parziali che cosa in qualche modo esponga questi membri con nomi più significativi. – cdonner

0

il mio xml di sqlmetal aveva impostazioni predefinite molto più sensate. non perfetto, ma migliore. Il primo FK ha ottenuto il nome della tabella, ma il secondo ha ottenuto il nome del campo.

<Association Name="FK_Product_DefaultOutputTypeID" Member="OutputType" 
    ThisKey="DefaultOutputTypeID" OtherKey="OutputTypeID" Type="OutputType" 
    IsForeignKey="true" /> 
    <Association Name="FK_Product_DefaultTileOutputTypeID" Member="DefaultTileOutputType" 
    ThisKey="DefaultTileOutputTypeID" OtherKey="OutputTypeID" Type="OutputType" 
    IsForeignKey="true" /> 

versione SQLMetal:

C:\Program Files\Microsoft Visual Studio 9.0\VC>sqlmetal /? 
    Microsoft (R) Database Mapping Generator 2008 version 1.00.21022 
    for Microsoft (R) .NET Framework version 3.5 
    Copyright (C) Microsoft Corporation. All rights reserved. 
    ... 
3

In VS2010 si può effettivamente cambiare titolo le proprietà per genitori e figli nella vista. È un po 'nascosto però.

  1. Nel visualizzatore dbml selezionare la relazione che disturba.
  2. Nella griglia Proprietà saranno presenti due righe Figlio e Proprietà padre.
  3. loro Expand c'è possibile modificare il nome della proprietà

Maggiori dettagli possono essere trovati qui: http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx

che è dove ho preso da.

+0

Non ho trovato via per ottenere le modifiche per sopravvivere ad un altro aggiornamento di andata e ritorno dal database :( –