Propiedad que debería ser un campo db de solo lectura (asignación automática fluida de NHibernate)
-
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 propiedadpropertyName
¿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?
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();
}
}