Член <некоторый столбец> не поддерживается в SubSonic - PullRequest
0 голосов
/ 23 июля 2010

Я использую шаблоны T4 SubSonic 3.0 для генерации классов и тому подобное для меня. Ну, в моей базе данных у меня есть таблица Zipcode с этими столбцами

  • ZipCode_rid
  • Почтовый индекс (фактический почтовый индекс в числовом формате)
  • Государство
  • и т.д.

Что ж, при запуске шаблонов T4 вместо столбца, подобного Zipcode.Zipcode, я получаю Zipcode.ZipcodeX. Затем при попытке выполнить простой запрос по этой таблице я получаю загадочную ошибку

Член 'ZipcodeX' не поддерживается

Запрос выглядит примерно так

var z= from z in Zipcode.All()
       where (z.ZipcodeX == "12345")
       select z;

Это ошибка в SubSonic или я что-то напутал? Какие есть обходные пути?

Я временно обошел эту проблему, переименовав столбец Zipcode в ZipCode .. но это не очень хорошее долгосрочное решение

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Это и ошибка в дозвуке, и вы делаете что-то не так. В настоящее время subsonic не поддерживает столбцы с тем же именем, что и таблица, в которой они содержатся. Шаблон пытается обойти это, добавив X к имени столбца, но дозвуковое ядро ​​взрывается.

Исправление заключается в переименовании вашей колонки или таблицы, Zipcode.Zipcode на самом деле не имеет смысла, может быть, Zipcode.Code будет более подходящим.

0 голосов
/ 30 ноября 2010

Я не уверен, сработает ли это, но вы можете попробовать. Это немного больно, но я заставил ее уйти.

Шаг 1 В settings.ttinclude есть функция

string CleanUp (строка tableName)

Создайте новый под ним вот так (добавив любой алгоритм расширения / переименования, который вам нравится

string 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 после

открытая статическая строка <# = col.CleanName #> Column { получить{ 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.

...