2012-08-13 25 views
5

Estoy intentando modificar una plantilla POCO T4 para incluir el nombre de la columna en la base de datos que corresponde a cada propiedad. Por razones de legado, nuestras tablas de base de datos son 8.3, y nuestras columnas tienen un máximo de 10 caracteres, por lo que las cosas tienden a ser revisadas. Ser capaz de buscar rápidamente a qué columna corresponde una propiedad determinada será de gran ayuda.Entity Framework y nombres de columna de base de datos

Dado que no tengo ni idea de cómo hacerlo. Me siento cómodo con la idea de editar la plantilla T4, simplemente no sé cómo recuperar el nombre de la columna de un objeto EdmProperty.

¿Alguien puede indicarme la dirección correcta?

+0

Supongo que edmProperty.Name no es lo que quieres decir. Desea el nombre de la columna subyacente. – Maarten

+0

@Maarten - Correcto. – Bobson

Respuesta

1

Ya he discutido esto en alguna otra respuesta, pero no puedo encontrarlo saber. El problema es que para obtener esta información necesita navegar por MSL parte de la asignación, la parte donde las columnas se asignan a las propiedades. Desafortunadamente, la API completa para los elementos de metadatos MSL es interna (creo que uno de los objetivos de la publicación futura de EF es hacerlo público). Cuando tienes una plantilla T4 para la generación de clases, normalmente trabajas con CSDL; esa es la descripción de la entidad y contiene solo la información que ves en el diagrama de EDMX y la ventana de propiedades para las entidades.

+0

¿Ni siquiera está disponible en MetadataWorkspace? Varias otras respuestas parecían indicar que sí lo era, aunque no pude encontrar la manera de hacerlo en la T4. – Bobson

+0

Está disponible en MetadataWorkspace pero las consultas en el área de trabajo devuelven elementos base y debe convertirlos para obtener acceso a los datos que está buscando. El problema con MSL es que no puede lanzarlo porque esos tipos no son públicos; debe usar el reflejo para obtener esos datos. –

+0

Estaría contento con una respuesta que utilizara la reflexión, suponiendo que la reflexión está disponible cuando se evalúa la T4. – Bobson

0

No diré que esta es la mejor manera de resolver este problema, pero así es como lo hice. Necesitaba poder recuperar los nombres de las columnas en texto plano para enlazar con los controles asp de BoundField, y eso no se incluyó en la plantilla de EF.

Así que agregué este código que solo carga las "propiedades simples", es decir, los nombres de las columnas, para permitirme hacer eso. Agrega una estructura al objeto "tabla" llamado "ColumnNames" y expone los nombres de las columnas como cadenas const.

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

coloqué esto antes de este fragmento de código en la plantilla T4 que genera los archivos individuales bajo el archivo edmx en la solución:

<# 
    EndNamespace(code); 
} 

que va a crear código que se parece a esto:

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"; 
    } 
} 

Espero que esto ayude.

+0

No tengo ese código frente a mí, pero ¿'simpleProperties' no te da los nombres basados ​​en el archivo' edmx'? Si la columna se llama 'myColumnID' en la base de datos, pero he cambiado el nombre en el diseñador a' MyColumnId' por el bien de la consistencia de C#, ¿qué nombre aparece aquí? – Bobson

+0

Por lo que sé, y aprendí EF ayer, así que podría estar equivocado, está basado en el archivo edmx, así que si cambias el nombre en el diseñador, aparece con el nombre edmx, y no el nombre de la base de datos, en el resultado. –

+1

Eso es lo que pensé. Esta es definitivamente una buena solución, pero para un problema diferente, entonces estaba teniendo. Mi pregunta era específicamente sobre cómo recuperar el nombre de la base de datos subyacente incluso después de renombrarlo. Estoy bastante convencido de que no es posible, pero te animo a dejar esta respuesta aquí para ayudar a cualquier otra persona que encuentre esta pregunta. – Bobson

Cuestiones relacionadas