Propiedad que debería ser un campo db de solo lectura (asignación automática fluida de NHibernate)

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

  •  13-12-2019
  •  | 
  •  

Pregunta

Estoy usando Fluent NHibernate junto con la función de asignación automática.Ahora estoy buscando algo como una configuración, configuración, atributo personalizado, lo que sea, para declarar una propiedad de entidad como "ReadOnlyFromDb".

En la base de datos MsSql, estoy usando una columna calculada en una de mis tablas donde se calcula un valor dependiendo de otros valores de la fila de datos específica.Ahora he declarado esta columna en la clase de entidad como

public virtual int STATUS { get; private set; }

Al obtener los datos específicos de la tabla, todo funciona bien.La propiedad STATUS se completa correctamente con el valor específico en la tabla de datos.

El problema ocurre cuando intento SaveUpdate() el objeto específico.siempre me sale la excepción

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

Lo cual es correcto, según tengo entendido, ¡y así es como se suponía que debía ser;)!

Básicamente estoy buscando una configuración, configuración, atributo personalizado, lo que sea, para decir.

Hola Fluent NHibernate: obtén la propiedad específica propertyName pero no inserte/actualice la propiedad propertyName

¿Hay algo como eso?¿O existe una solución para este caso?Busqué en la wiki fluida de nhibernate pero no encontré un caso similar.

¡Espero que alguien ya haya enfrentado y resuelto este problema!

Aquí está el fragmento de código de cómo creo la sesión (tal vez ayude):

    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;
    }
}

Gracias hasta ahora por la respuesta. Me ayudó hasta ahora.Pero, ¿hay alguna manera de resolver esto de forma más "dinámica"?

Por ejemplo:

Quiero declarar un atributo personalizado llamado [ReadOnlyDbField] ahora declare todas las propiedades de la entidad con este atributo personalizado para decir:Simplemente lea este valor y no lo actualice ni lo inserte.

Básicamente quiero decir en la configuración.

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

¿Hay alguna manera de implementar esto?

¿Fue útil?

Solución

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

actualizar:cuenta para pregunta editada

public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField>
{
    protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance)
    {
        instance.Not.Insert();
        instance.Not.Update();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top