Propriedade que deve ser um campo db somente leitura (Fluent NHibernate Automapping)
-
13-12-2019 - |
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 propriedadepropertyName
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?
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();
}
}