내가하고 싶은 것은 저장시 엔티티를 가로 채고 일부 문자열 속성을 잘라내는 것입니다.NHibernate Interceptor - OnFlushDirty
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가 개체에 전파되지만 은 데이터베이스에 반드시 (즉시) 적용되는 것은 아닙니다. 은 인터셉터가 previousState를 수정하지 말 것을 강력하게 권장합니다.
또한 말한다 : 객체가 flush 동안에, 더러운 것으로 감지 될 때 호출
.
그래서 난 그냥, 정확하게 개체를 더러운 것으로 감지 될 때 호출
이 문서에 대한
또한
, 변경 사항이 데이터베이스에 저장됩니다 무엇을 의미하는지 확실하지 않다 꼭 필요한 것은 아닙니다.
어쨌든, 내 프로젝트에서 이것을 테스트하면이 기능이 작동하고 OnFlushDirty()
이 호출되고 일부 속성 값이 변경되면 데이터베이스에 저장되고 모든 이음매가 제대로 작동합니다.
제 질문은 : 할 올바른지? 내가 말했듯이, 나는 프로젝트와 함께 그것을 테스트하고 엔티티를 변경/업데이트하는 경우 OnFlushDirty()
이 호출되며 속성이 변경되어 데이터베이스에도 저장됩니다. 이 모든 내용과 약한 문서 때문에이 문제가 발생할 수 있는지 확실하지 않습니다.
예, 영구 속성을 수정 한 경우 true로 반환됩니다. 문제의 코드로 실수 한 경우 지금 업데이트 된 코드를 확인하십시오. 일부 속성을 수정해야하고'OnFlushDirty'에서'true'를 반환해야한다면'FindDirty'를 오버라이드 한 후'OnFlushDirty'가 항상 존재한다는 것을 확신 할 수 있습니다 그것은 필요할 때 호출되며 객체 (Entity)와 데이터베이스에서도 속성을 업데이트 할 것입니다. – carpics
그냥'FindDirty'가'int []'int의 배열을 반환하고, 그것을 덮어 쓰고'true '를 반환 할 수 있습니다. – carpics
나는 내 대답을 약간 업데이트했습니다. FindDirty 메서드에서 속성 자체를 수정할 수 있는지 여부는 확실하지 않습니다. –