2012-08-13 14 views
5

Sto tentando di modificare un modello POCO T4 per includere il nome della colonna nel database corrispondente a ciascuna proprietà. Per motivi legacy, le nostre tabelle di database sono 8.3 e le nostre colonne hanno un massimo di 10 caratteri, quindi le cose tendono ad essere abbreviate. Essere in grado di cercare rapidamente in quale colonna corrisponde una determinata proprietà sarà di grande aiuto.Entity Framework e nomi delle colonne del database

Dato ciò, non ho idea di come procedere. Mi sento a mio agio con l'idea di modificare il modello T4, ma non so come recuperare il nome della colonna da un oggetto EdmProperty.

Qualcuno può indicarmi la giusta direzione?

+0

Sto assumendo edmProperty.Name non è ciò che intendi. Vuoi il nome della colonna sottostante. – Maarten

+0

@Maarten - corretto. – Bobson

risposta

1

Ne ho già discusso in un'altra risposta, ma non riesco a trovarlo. Il problema è che per ottenere queste informazioni è necessario consultare la parte MSL del mapping, la parte in cui le colonne sono mappate alle proprietà. Sfortunatamente l'intera API per gli elementi dei metadati MSL è interna (credo che un obiettivo per la futura release di EF sia renderlo pubblico). Quando si dispone di un modello T4 per la generazione di classi, si lavora normalmente con CSDL, che è la descrizione dell'entità e contiene solo le informazioni che si vedono nel diagramma EDMX e nella finestra delle proprietà delle entità.

+0

Non è nemmeno disponibile in MetadataWorkspace? Diverse altre risposte sembravano indicare che lo era, anche se non riuscivo a capire come ottenerlo nel T4. – Bobson

+0

È disponibile in MetadataWorkspace ma le query nello spazio di lavoro restituiscono gli elementi di base e devi eseguirli per ottenere l'accesso ai dati che stai cercando. Il problema con MSL è che non puoi eseguire il cast perché quei tipi non sono pubblici: devi usare il reflection per ottenere quei dati. –

+0

Sarei felice con una risposta che utilizza il riflesso, supponendo che la riflessione sia disponibile quando viene valutato il T4. – Bobson

0

Non dirò che questo è il modo migliore per risolvere questo problema, ma è così che l'ho fatto. Avevo bisogno di essere in grado di recuperare i nomi delle colonne in testo in chiaro per il binding ai controlli asp di BoundField e che non era stato inserito nel modello EF.

Quindi, ho aggiunto questo bit di codice che carica solo le "proprietà semplici", ovvero i nomi delle colonne, per consentirmi di farlo. Aggiunge una struttura all'oggetto "table" chiamato "ColumnNames" e espone i nomi delle colonne come stringhe const.

<# 
    if (simpleProperties.Any()) 
    { 
#> 
    public struct ColumnName 
    { 
    <# 
     foreach (var simpleProperty in simpleProperties) 
     { 
    #> 
     public const string <#= simpleProperty #> = "<#= simpleProperty #>"; 
    <# 
     } 
    #> 
    } 
<# } 
#> 
} 

ho messo questo prima di questa porzione di codice nel modello T4 che genera i singoli file sotto il file edmx nella soluzione:

<# 
    EndNamespace(code); 
} 

che creerà il codice che assomiglia a questo:

public partial class JobPosting 
{ 
    public int PositionRowId { get; set; } 
    public System.Guid PositionRelatedGuid { get; set; } 

    public struct ColumnName 
    { 
     public const string PositionRowId = "PositionRowId"; 
     public const string PositionRelatedGuid = "PositionRelatedGuid"; 
    } 
} 

Spero che questo aiuti.

+0

Non ho quel codice di fronte a me, ma 'simpleProperties' non ti dà i nomi basati sul file' edmx'? Se la colonna è chiamata 'myColumnID' nel database, ma io l'ho rinominata nella finestra di progettazione per' MyColumnId' per l'amor di coerenza di C#, quale nome appare qui? – Bobson

+0

Per quanto ne so, ho appreso EF ieri, quindi potrei sbagliarmi, è basato sul file edmx, quindi se lo si rinomina nella finestra di progettazione allora si presenta con il nome edmx, e non con il nome del database, nel risultato. –

+1

Questo è quello che pensavo. Questa è sicuramente una buona soluzione, ma per un problema diverso che stavo avendo. La mia domanda riguardava specificamente come recuperare il nome del database sottostante anche dopo averlo rinominato. Sono praticamente convinto che non sia possibile, ma ti incoraggio a lasciare questa risposta qui per aiutare chiunque trovi questa domanda. – Bobson

Problemi correlati