Элемент <некоторый столбец> не поддерживается в SubSonic.
Вопрос
Я использую шаблоны T4 SubSonic 3.0 для создания классов и тому подобного.В моей базе данных есть таблица почтовых индексов с этими столбцами.
- Почтовый индекс_rid
- Почтовый индекс (фактический почтовый индекс в числовом формате)
- Состояние
- и т. д.
Что ж, когда запускаются шаблоны T4, вместо столбца типа Zipcode.Zipcode
я получил Zipcode.ZipcodeX
.Затем при попытке выполнить простой запрос к этой таблице я получаю загадочную ошибку.
Член «ZipcodeX» не поддерживается.
Запрос что-то простое, вроде этого
var z= from z in Zipcode.All()
where (z.ZipcodeX == "12345")
select z;
Это ошибка SubSonic или я что-то путаю?Какие обходные пути существуют?
Я временно решил эту проблему, переименовав Zipcode
столбец в ZipCode
..но это не очень хорошее долгосрочное решение
Решение
Это оба ошибка в дозвуковой, и вы делаете что-то не так.В настоящее время дозвуковые не поддерживают столбцы с тем же именем, что и таблица, которая их содержит.Шаблон пытается работать вокруг этого, добавив X в имени столбца, но дозвуковая ядра затем удается вверх.
Исправление - переименовать вашу колонку или таблицу, zipcode.zipp код на самом деле не имеет смысла для меня, возможно, zipcode.code будет более подходящим.
Другие советы
Я не уверен, что это сработает, но вы можете попробовать.Это немного больно, но я справился с этим.
Шаг 1В settings.ttinclude есть функция
строка CleanUp (строка tableName)
Создайте новый прямо под ним, вот так (добавив любой алгоритм расширения/переименования, который вам нравится
строка CleanUp (строка colName, строка tableName) {
string result=colName; //strip blanks result=result.Replace(" ",""); //put your logic here... if (result.ToLower() == tableName.ToLower()) { result = colName + "X"; } return result;
}
Шаг 2В SQLServer.ttinclude (или эквивалентном файле для вашего источника данных) примерно в строке 167 есть такая строка:
col.CleanName = CleanUp(col.Name);
Измените это на:
col.CleanName = CleanUp(col.Name, tbl.Name);
Шаг 3Вот тут действительно начинается боль.Возьмите исходный код SubSonic.Core (Да :( ) и измените в DatabaseTable.cs
public IColumn GetColumnByPropertyName(string PropertyName)
к
public virtual IColumn GetColumnByPropertyName(string PropertyName)
Шаг 4В Structs.tt после
public Static String < #= col.cleanName #> Column {get {return "< #= col.name #>";}}
добавьте следующее
<# if (col.CleanName != col.Name) { #>
public override IColumn GetColumnByPropertyName(string columName){ if (columName == "<#= col.CleanName #>") return <#=col.CleanName#>; else return base.GetColumnByPropertyName(columName); }
<# } #>
После этого вам, вероятно, придется заново создать все файлы .cs.