Mysql
 sql >> Base de données >  >> RDS >> Mysql

SubSonic 3 et MySQL, la suppression du trait de soulignement du nom de la colonne dans la méthode CleanUp() provoque des exceptions lors de l'utilisation de la propriété dans linq-query

Pendant de nombreux mois, cela a été un problème pour moi et j'ai simplement évité les traits de soulignement lorsque je travaillais avec SubSonic sur n'importe quelle base de données prise en charge. Jusqu'à hier, lorsque j'ai dû prendre en charge un projet hérité qui avait des traits de soulignement dans sa base de données SQL Server.

Vous devrez le corriger dans le code source de SubSonic.Core (fichier :SubSonic.Core\Schema\DatabaseTable.cs) :

Trouvez cette méthode :

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

Et changez-le en :

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

Ensuite, vous devrez modifier votre Structs.tt :

Trouvez ceci vers le haut :

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#>
});

Et ajoutez cette ligne :

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

Pour qu'il devienne :

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#>
});

Le problème est qu'une fois que vous avez nettoyé les noms de colonne, SubSonic essaie de trouver les colonnes valides dans votre requête en faisant correspondre vos noms de propriété générés par SubSonic. par rapport aux noms de colonne d'origine de la base de données .

Ces modifications garantiront que SubSonic les associera au nom de propriété nettoyé. .