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

0

У меня возникла проблема при использовании 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, с сообщением "Member EntityName" не поддерживается.

Если я удалю

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

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

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

  • 0
    в какой версии у меня нет проблем с прописными и строчными буквами, что вы используете для создания таблиц, вы обнаружите, что с mysql и subsonic вашими автоматически генерируемыми ключами должен быть TableNameID минус S и что все имена таблиц заканчиваются на s тоже, чтобы сделать вещи проще
  • 0
    СОЗДАТЬ HomeScrolls ЕСЛИ НЕ HomeScrolls ( HomeScrollID mediumint (9) NOT NULL auto_increment, HomeScrollImage varchar (255) NOT NULL, HomeScrollShow tinyint (1) НЕ HomeScrollID , HomeScrollShow HomeScrollShow ( HomeScrollID ), HomeScrollShow ( HomeScrollShow ) HomeScrollShow ) = ENG latin1 AUTO_INCREMENT = 5; Прописные буквы отлично работают !!!!!!!!
Показать ещё 1 комментарий
Теги:
subsonic3
subsonic

1 ответ

2
Лучший ответ

В течение многих месяцев это было проблемой для меня, и я просто избегал подчеркивания при работе с 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 пытается найти допустимые столбцы в вашем запросе, сопоставляя ваши имена свойств с именем Sub << → с именами столбцов базы данных" > strong > .

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню