Что я хочу сделать, это перехватить объект для сохранения и обрезать некоторые свойства строки.NHibernate Interceptor - OnFlushDirty
Проблема заключается в том, что OnSave()
запускается только для новых Entity
, но не при изменении/обновлении Entity
.
Затем есть перехватчик OnFlushDirty()
. Но я действительно смущен этим.
Так что я хочу изменить некоторые свойства объекта по обновлению сущности, как:
public bool OnFlushDirty(
object entity,
object id,
object[] currentState,
object[] previousState,
string[] propertyNames,
IType[] types)
{
bool entityChanged = false;
for (int i = 0; i < propertyNames.Length; i++)
{
var stringType = types[i] as NHibernate.Type.StringType;
if (stringType != null)
{
if(NeedTruncate(currentState[i]))
{
currentState[i] = Truncate(currentState[i]);
entityChanged = true;
}
}
}
return entityChanged;
}
Так вопрос в следующем. В некоторых блогах, таких как this one, я читал, что OnFlushDirty()
вызывается, когда сущность была изменена и сохранена в базе данных, поэтому изменения любого свойства здесь не будут сохранены в базе данных.
Но в githab.io документации говорится:
Перехватчик может изменить обнаруженный CurrentState, который будет распространяющийся как к базе данных и хранимый объект. Обратите внимание, что все флеши заканчиваются фактической синхронизацией с базой данных, в , которая, поскольку новый currentState будет передан объекту, но не обязательно (сразу) в базу данных. Настоятельно рекомендуется , чтобы перехватчик не изменял предыдущее состояние.
Он также говорит:
Вызывается, когда объект обнаружен быть грязным, во флеш.
Так что я не уверен, что именно означает
Вызывается, когда объект обнаружен быть грязным
Также в отношении к этой документации, изменения будут сохранены в базе данных, просто не обязательно сразу.
В любом случае, тестируя это в моем проекте, это работает, и когда вызывается OnFlushDirty()
, и он изменяет значение некоторого свойства, он также сохраняется в базе данных, и все швы работают нормально.
Итак, мой вопрос: правильно ли это делать? Как я уже сказал, я тестировал его с моим проектом, а также при изменении/обновлении объекта OnFlushDirty()
, свойство было изменено и сохранено в базе данных. Просто потому, что все это и слабая документация, я не уверен, могу ли я столкнуться с некоторыми проблемами с этим?
Да, я возвращаю true, если я изменил постоянное свойство, только я сделал ошибку с кодом, о котором идет речь, пожалуйста, проверьте обновленный код. Итак, как только я переопределяю 'FindDirty', чтобы возвращать' true', если мне нужно изменить некоторое свойство, а также вернуть 'true' из' OnFlushDirty', если я изменил какое-то свойство, я могу быть уверен, что 'OnFlushDirty' будет всегда когда он мне нужен, и что он будет обновлять свойство в объекте (Entity) и в базе данных? – carpics
Только 'FindDirty' возвращает и массив int' int [] ', как я могу переопределить его и вернуть' true' – carpics
Я немного обновил свой ответ. Я не уверен, можете ли вы сами изменить свойство в методе FindDirty .... –