nhibernate - type - reference required to assembly netstandard
IPreUpdateEventListener y dynamic-update="true" (2)
He estado tratando de hacer un escenario de auditoría muy simple siguiendo el blog de Ayende, que parece ser el recurso al que todos se refieren cuando se trata de IPreUpdateEventListener y IPreInsertEventListener.
Sin embargo, no importa cuánto lo intenté, no pude hacer que funcionara. El evento se activó correctamente, todo parecía estar bien cuando lo revisé, pero nunca se publicó ninguna actualización de mi "tiempo de cambio" en la base de datos.
Pasé aproximadamente un día buscando en Google esto y finalmente encontré la respuesta aquí .
Simplemente no funcionará cuando haya mapeado su entidad con dynamic-update = "true". Y efectivamente, ese fue el caso para mí. Dado que fue tan difícil para mí encontrar esta información, ¿no es común usar dynamic-update = "true"? Lo usamos en todas nuestras entidades.
Como este es un gran bache en el camino para nosotros, quería preguntar si hay alguna forma de evitarlo.
He estado viendo IInterceptor, pero siempre se califica de obsoleto, así que ¿cuáles son los inconvenientes con esto? Además, no he podido encontrar un buen tutorial sobre cómo archivar la misma auditoría (con marcas de tiempo de inserción / actualización) con IInterceptor (soy bastante nuevo en NHibernate).
¡Cualquier ayuda sería apreciada!
Me encontré con este problema exacto. Así es como lo arreglé:
public class MyFlushEntityEventListener : DefaultFlushEntityEventListener
{
protected override void DirtyCheck(FlushEntityEvent e)
{
base.DirtyCheck(e);
if (e.DirtyProperties != null &&
e.DirtyProperties.Any() &&
//ITrackUpdate is my inteface for audited entities
e.Entity is ITrackUpdate)
e.DirtyProperties = e.DirtyProperties
.Concat(GetAdditionalDirtyProperties(e)).ToArray();
}
static IEnumerable<int> GetAdditionalDirtyProperties(FlushEntityEvent @event)
{
yield return Array.IndexOf(@event.EntityEntry.Persister.PropertyNames,
"UpdateTime");
yield return Array.IndexOf(@event.EntityEntry.Persister.PropertyNames,
"UpdateUser");
//You can add any additional properties here.
//Some of my entities do not track the user, for example.
}
}
Luego, simplemente reemplace el detector de eventos en el archivo de configuración de NH:
<listener type="flush-entity"
class="MyFlushEntityEventListener, MyAssembly"/>
Tuve el mismo problema, sin embargo, descubrí que podía OnFlushDirty
utilizando OnFlushDirty
.