У меня возникла проблема при использовании 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, что не совсем то, что я хочу.
Если кто-нибудь знает, почему это произойдет, я бы с удовольствием это услышал. Если можно исправить, еще лучше! Это не шоу, но это немного раздражает.
В течение многих месяцев это было проблемой для меня, и я просто избегал подчеркивания при работе с 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 будет сопоставлять их с очищенным именем свойства.
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; Прописные буквы отлично работают !!!!!!!!