SubSonic 3 y MySQL, Quitar subrayado del nombre de columna en CleanUp () método hace excepciones cuando se utiliza la propiedad en linq-query

StackOverflow https://stackoverflow.com/questions/2286884

Pregunta

Me he encontrado con un problema cuando se utiliza SubSonic 3 (.0.0.3) ActiveRecord con MySQL.

Desde MySQL no permite utilizar letras mayúsculas en los nombres de tabla o columna (o más bien no tiene en cuenta que si lo hace) decidí separar las palabras mediante guiones, por ejemplo, entity_id y, a continuación, utilizar el método de limpieza () para añadir carcasa título y eliminar los subrayados.
Un amigo escribió un método ToTitleCase (cadena s) que tiene este aspecto:

string ToTitleCase(string s)
{
    CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cultureInfo.TextInfo;
    return textInfo.ToTitleCase(s);
}

Y el método de limpieza () es el siguiente:

string CleanUp(string tableName){
    string result=tableName;

    //strip blanks
    result=result.Replace(" ","");

    //put your logic here...
    result = ToTitleCase(result);
    result = result.Replace("_", "");

    return result;
}

Y si lo:

var entity = Entity.All().Where(e => e.EntityName.Contains("John"));

consigo un NotSupportedException, con el mensaje "El miembro no es compatible 'EntityName'."

Si quito

result = result.Replace("_", "");

Todo funciona muy bien, lo único que consigue el aspecto de propiedades ENTITY_ID que no es exactamente lo que yo quiero.

Si alguien sabe por qué esto sucede, me encantaría escucharlo. Si es posible fijar, aún mejor! No es un sensacional pero es un poco molesto.

¿Fue útil?

Solución

Para muchos muchos meses esto era un problema para mí y me acaba de evitar subrayado cuando se trabaja con SubSonic en cualquier base de datos compatible. Hasta ayer cuando tuve que apoyar un proyecto de legado que tenía subrayado en su base de datos SQL Server.

Vas a tener que fijarlo dentro del código fuente de SubSonic.Core (archivo: SubSonic.Core \ Schema \ DatabaseTable.cs):

Para este método:

public IColumn GetColumnByPropertyName(string PropertyName)
{
    return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}

Y cambiarlo a:

public IColumn GetColumnByPropertyName(string PropertyName)
{
    return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}

A continuación, tendrá que modificar su Structs.tt

Para esta cerca de la parte superior:

Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
{
    IsPrimaryKey = <#=col.IsPK.ToString().ToLower()#>,
    DataType = DbType.<#=col.DbType.ToString()#>,
    IsNullable = <#=col.IsNullable.ToString().ToLower()#>,
    AutoIncrement = <#=col.AutoIncrement.ToString().ToLower()#>,
    IsForeignKey = <#=col.IsForeignKey.ToString().ToLower()#>,
    MaxLength = <#=col.MaxLength#>
});

Y añade esta línea:

    PropertyName = "<#=col.CleanName#>",

Para que se convierte en:

Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
{
    PropertyName = "<#=col.CleanName#>",
    IsPrimaryKey = <#=col.IsPK.ToString().ToLower()#>,
    DataType = DbType.<#=col.DbType.ToString()#>,
    IsNullable = <#=col.IsNullable.ToString().ToLower()#>,
    AutoIncrement = <#=col.AutoIncrement.ToString().ToLower()#>,
    IsForeignKey = <#=col.IsForeignKey.ToString().ToLower()#>,
    MaxLength = <#=col.MaxLength#>
});

El problema es que una vez que limpiaste los nombres de columna, SubSonic intenta el hallazgo las columnas válidos en la consulta, haciendo coincidir su SubSonic genera nombres propiedad contra nombres originales de las columnas de la base de datos .

Estos cambios se asegurará de que sea SubSonic juego contra el limpiado nombre de la propiedad .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top