Элемент <некоторый столбец> не поддерживается в SubSonic.

StackOverflow https://stackoverflow.com/questions/3313788

  •  27-09-2020
  •  | 
  •  

Вопрос

Я использую шаблоны 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top