Pergunta

Estou usando o Nibernato Fluente e mapeando automaticamente as classes.

Eu tenho uma propriedade calculada em uma classe ao longo das linhas de

public virtual DateTime? LastActionTimeStamp
{
    get {
        return Actions.Count == 0 ? null : Actions.OrderByDescending(
            a => a.TimeStamp).ElementAt(0).TimeStamp;
    }
}

Isso não foi mapeado com o restante das propriedades, então não pude usá -lo em uma restrição de ICRITERIA. Eu adicionei um setter vazio (como li em algum lugar que isso o incluiria no mapeamento, o que ele faz), mas agora estou recebendo um erro de Nibernate:

Não foi possível executar a consulta ... Nome da coluna inválida 'LastActionTimestamp'.

Portanto, minha pergunta é: como digo a Fluent Nibernate para dizer ao Nibernate para ignorar o banco de dados para esta propriedade, mas ainda retorna o valor calculado da propriedade Get?

Foi útil?

Solução

Você pode associar uma fórmula à propriedade e usá -lo em vez do código C#. por exemplo

Propriedade:

private int _postCount = 0;
public virtual int PostCount
{
    get
    {
        return _postCount;
    }
}

Fórmula:

(SELECT count(p.ID) FROM BlogPost p WHERE p.BlogID = ID and p.IsDeleted = 0)

E então você pode usar o PostCount em sua expressão como de costume. Lembre -se de definir o modificador de acesso na propriedade em seu FluentMapping. Não tenho certeza de quais suportes fluentes, mas as opções que encontrei para o mapeamento normal são:

* property
* field
* field.camelcase
* field.camelcase-underscore
* field.pascalcase-m-underscore
* field.lowercase-underscore
* nosetter.camelcase
* nosetter.camelcase-underscore
* nosetter.pascalcase-m-underscore
* nosetter.lowercase-underscore

Provavelmente melhor confira a documentação do Nibernate para a lista oficial Estratégias de acesso Então você combina a estratégia de acesso com a estratégia de nomenclatura, por exemplo, "Field.Lowercase-UnderScore"

Outras dicas

Não tenho certeza de que você possa fazer isso com Nibernate, mas eu poderia estar errado. Nibernate traduz seus critérios em SQL e, portanto, essa propriedade não estaria disponível para consultar (não está no banco de dados!).

No entanto, se eu estiver errado (e isso é frequente), você poderá mapeá -lo com uma substituição.

Na sua configuração de automóvel, crie um sobrepor e mapear essa propriedade explicitamente usando o Access propriedade para dizer a Nibernate como tratá -lo.

Algo assim:

AutoMap.AssemblyOf<YourEntity>()
  // automapping stuff
  .Override<ThatClass>(m =>
  {
    m.Map(x => x.LastActionTimeStamp)
      .Access.None();
  });

Você também pode substituir o mapeamento e ignorar a propriedade:

public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass>
{
  public void Override(AutoMapping<ThatClass> mapping)
        {
            mapping.IgnoreProperty(x=> x.PropertyToIgnore);
        }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top