SubSonic 3 и MySQL, удаление подчеркивания из имени столбца в методе CleanUp () вызывает исключения при использовании свойства в linq-запросе

У меня возникла проблема при использовании SubSonic 3 (.0.0.3) ActiveRecord с MySQL.

Поскольку MySQL не позволяет вам использовать прописные буквы в именах таблиц или столбцов (или, скорее, игнорирует это, если вы это делаете), я решил разделять слова с помощью подчеркивания, например entity_id, а затем используйте метод CleanUp () для добавления корпуса заголовка и удаления подчеркивания.
Друг написал метод ToTitleCase (string s), который выглядит следующим образом:

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

А метод CleanUp () выглядит так:

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

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

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

    return result;
}

Если я тогда сделаю:

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

Я получаю NotSupportedException с сообщением «Элемент EntityName не поддерживается».

Если я удалю

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

Все работает нормально, только я получаю свойства, похожие на Entity_Id, что не совсем то, что мне нужно.

Если кто-нибудь знает, почему это произошло, я хотел бы это услышать. Если можно исправить, то даже лучше! Это не шоу-стоп, но немного раздражает.


person Emil Badh    schedule 18.02.2010    source источник
comment
в какой версии вы используете, у меня нет проблем с прописными и строчными буквами, что вы используете для создания своих таблиц, вы обнаружите, что с mysql и subsonic ваши автоматически сгенерированные ключи должны быть TableNameID минус S и что все имена таблиц заканчиваются на s, чтобы облегчить задачу   -  person davethecoder    schedule 24.02.2010
comment
СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ HomeScrolls (HomeScrollID mediumint (9) NOT NULL auto_increment, HomeScrollImage varchar (255) NOT NULL, HomeScrollShow tinyint (1) NOT NULL, PRIMARY KEY (HomeScrollID), KEY HomeScrollShow (HomeScrollShow)) ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 5; Прописные буквы работают нормально !!!!!!!!   -  person davethecoder    schedule 24.02.2010
comment
Я использую MySQL 5.1.36 Community. Я могу создавать таблицы и столбцы с прописными буквами, но, как я уже сказал, MySQL игнорирует это, и когда я запускаю шаблоны SubSonic, свойства создаются с именами в нижнем регистре.   -  person Emil Badh    schedule 25.02.2010


Ответы (1)


В течение многих месяцев это было проблемой для меня, и я просто избегал подчеркивания при работе с SubSonic на любой поддерживаемой БД. До вчерашнего дня, когда мне пришлось поддерживать устаревший проект, в базе данных SQL Server которого были символы подчеркивания.

Вам нужно будет исправить это в исходном коде SubSonic.Core (файл: SubSonic.Core \ Schema \ DatabaseTable.cs):

Найдите этот метод:

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

И измените его на:

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

Затем вам нужно будет изменить свой Structs.tt:

Найдите это вверху:

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

И добавьте эту строку:

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

Так что становится:

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

Проблема в том, что после того, как вы очистили имена столбцов, SubSonic пытается найти допустимые столбцы в вашем запросе, сопоставляя сгенерированные SubSonic имена свойств с исходными именами столбцов базы данных.

Эти изменения гарантируют, что SubSonic сопоставляет их с очищенным именем свойства.

person Nosynchro    schedule 24.06.2010