Pergunta

Estou usando o Fluent NHibernate junto com a funcionalidade de mapeamento automático.Agora estou procurando algo como uma configuração, configuração, atributo personalizado - qualquer que seja - para declarar uma propriedade de entidade como "ReadOnlyFromDb"

No banco de dados MsSql, estou usando uma coluna computada em uma das minhas tabelas onde um valor é calculado dependendo de alguns outros valores da linha de dados específica.Agora eu declarei esta coluna na classe de entidade como

public virtual int STATUS { get; private set; }

Ao obter os dados específicos da tabela tudo funciona bem.A propriedade STATUS é preenchido corretamente com o valor específico na tabela de dados.

O problema ocorre quando tento SaveUpdate() o objeto específico.Eu sempre recebo a exceção

A computed column cannot be the target of an INSERT or UPDATE statement

O que é correto para o meu entendimento - e é como deveria ser;)!

Basicamente, estou procurando uma configuração, configuração, atributo personalizado - tanto faz - para dizer

Ei, Fluent NHibernate - obtenha a propriedade específica propertyName mas não insira/atualize a propriedade propertyName

Existe algo assim?Ou existe uma solução alternativa para este caso?Pesquisei no wiki fluente do nhibernate, mas não encontrei nenhum caso semelhante.

Espero que alguém já tenha enfrentado e resolvido esse problema!

Aqui está o trecho de código de como crio a sessão (talvez ajude):

    public static ISessionFactory GetNHibernateSession()
    {
        if (nhibernateSession != null)
            return nhibernateSession;

        if (ConfigurationManager.AppSettings[msSqlConnectionString] == null || ConfigurationManager.AppSettings[msSqlConnectionString] == String.Empty)
            throw new NullReferenceException(String.Format("AppSetting '{0}' must not be null!", msSqlConnectionString));

        //nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
        //                              .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<T_ABWEICHUNGEN>().IgnoreBase<BaseClass>)).BuildSessionFactory();

        nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
                                   .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(System.Reflection.Assembly.GetExecutingAssembly())
                                   .Override<T_ABWEICHUNGEN>(map =>map.Map(d => d.A08_STATUS_FILE).Length(2147483647))
                                   .IgnoreBase(typeof(BaseClass))
                                   .IgnoreBase(typeof(IDColumn))
                                   .IgnoreBase(typeof(MsSqlQuery))
                                   .IgnoreBase(typeof(MsSqlParamCollection))
                                   .IgnoreBase(typeof(AbweichungStatus))
                                   )).BuildSessionFactory();
        return nhibernateSession;
    }
}

obrigado até agora pela resposta - me ajudou até agora.Mas - existe uma maneira de resolver isso de forma mais “dinâmica”?

Por exemplo:

Quero declarar um atributo personalizado chamado [ReadOnlyDbField] agora declare todas as propriedades da entidade com este atributo personalizado para dizer:Basta ler este valor e não atualizá-lo/inserí-lo.

Basicamente eu quero dizer na configuração

Map all properties with the custom attribute [ReadOnlyDbField] to Not.Insert().Not.Update()

Existe uma maneira de implementar isso?

Foi útil?

Solução

.Override<Entity>(map => map.Map(d => d.STATUS).Not.Insert().Not.Update())

atualizar:conta para pergunta editada

public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField>
{
    protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance)
    {
        instance.Not.Insert();
        instance.Not.Update();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top