Pergunta

Estou usando os templates T4 do SubSonic 3.0 para gerar classes e tal para mim.Bem, no meu banco de dados eu tenho uma tabela CEP com essas colunas

  • CEP_rid
  • CEP (o CEP real em formato numérico)
  • Estado
  • etc.

Bem, quando os modelos T4 são executados, em vez de ter uma coluna como Zipcode.Zipcode eu recebo Zipcode.ZipcodeX.Então, ao tentar executar uma consulta simples nesta tabela, recebo o erro enigmático

O membro 'ZipcodeX' não é compatível

A consulta é algo simples como isto

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

Isso é um bug no SubSonic ou estou bagunçando alguma coisa?Que soluções alternativas existem?

Eu resolvi temporariamente esse problema renomeando o Zipcode coluna para ZipCode..mas esta não é uma solução muito boa a longo prazo

Foi útil?

Solução

Isso é um bug subsônico e você está fazendo algo errado.Atualmente subsônico não oferece suporte a colunas com o mesmo nome da tabela que as contém.O modelo tenta contornar isso adicionando o X ao nome da coluna, mas o núcleo subsônico explode.

A solução é renomear sua coluna ou tabela, Zipcode.Zipcode realmente não faz sentido para mim, talvez Zipcode.Code seja mais apropriado.

Outras dicas

Não tenho certeza se isso funcionará, mas você pode tentar.É um pouco doloroso, mas consegui fazê-lo ir.

Passo 1Em settings.ttinclude existe uma função

string CleanUp(string nomedatabela)

Crie um novo logo abaixo dele assim (adicionando qualquer algoritmo de extensão/renomeação que você quiser

string CleanUp(string colNome, string nometabela){

  string result=colName;

  //strip blanks
  result=result.Replace(" ","");

  //put your logic here...
  if (result.ToLower() == tableName.ToLower())
  {
      result = colName + "X";
  }

  return result;

}

Passo 2Em SQLServer.ttinclude (ou no arquivo equivalente para sua fonte de dados) existe por volta da linha 167 uma linha como:

col.CleanName = Limpar(col.Nome);

Mude isso para:

col.CleanName = CleanUp(col.Nome, tbl.Nome);

etapa 3É aqui que a dor realmente começa.Pegue o código fonte para SubSonic.Core (Sim :() e em DatabaseTable.cs altere

    public IColumn GetColumnByPropertyName(string PropertyName)

para

    public virtual IColumn GetColumnByPropertyName(string PropertyName)

Passo 4Em Structs.tt depois

public static string < #= col.cleanname #> coluna {get {return "< #= col.name #>";}}

adicione o seguinte

<# if (col.CleanName! = col.Name) { #>

       public override IColumn GetColumnByPropertyName(string columName){
           if (columName == "<#= col.CleanName #>")
               return <#=col.CleanName#>;
            else
               return base.GetColumnByPropertyName(columName);
        }

<# } #>

Você provavelmente precisará regenerar todos os arquivos .cs depois de fazer isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top