मेरे पास एक उपयोगकर्ता है जिसमें कई भूमिकाएं हैं। उपयोगकर्ता एक लिंक इकाई तालिका का उपयोग कर भूमिकाओं से जुड़ा हुआ है। जब उपयोगकर्ता को हटा दिया जाता है तो मैंने उपयोगकर्ता भूमिका लिंक इकाइयों को कैस्केड करने के लिए कॉन्फ़िगरेशन फ़ाइल सेट की है।सत्र क्यों है। OnPostUpdate में "सत्र में संभावित nonthreadsafe पहुंच" अपवाद का कारण बनता है?
हम वर्तमान में इकाइयों को हटाने के लिए सॉफ्ट डिलीट का उपयोग कर रहे हैं। हमने एक सॉफ्ट डिलीट इवेंट श्रोता जोड़ा है जो एक डिलीट द्वारा ट्रिगर किया गया है। जब कोई इकाई हटाई जा रही है, तो यह DeleteEntity
ईवेंट ट्रिगर करता है जो इकाई को हटाए जाने के रूप में चिह्नित करता है।
हमने इकाई पर Evict को कॉल करके कैश से इकाइयों को हटाने के लिए OnPostUpdate
ईवेंट ओवरराइड भी किया है।
यदि मैं बिना किसी भूमिका के उपयोगकर्ता बनाता हूं, तो इसे हटाएं, सब कुछ ठीक काम करता है (यह कैस्केड अक्षम होने पर भी काम करता है)। हालांकि अगर मेरे पास कम से कम एक भूमिका नियुक्त उपयोगकर्ता है और मैं OnPostUpdate
में Evict को कॉल करने के बाद उपयोगकर्ता को हटा देता हूं, तो मुझे एनएचबीर्नेट अपवाद मिलता है "NHibernate.AssertionFailure: संभावित nonthreadsafe सत्र तक पहुंच"।
मैंने OnPostUpdate
में, इकाई सत्र को निष्कासित करने के लिए बाल सत्र का उपयोग करने की कोशिश की है, अपवाद नहीं फेंक दिया गया है, हालांकि, इकाई को बेदखल नहीं किया गया है।
public void UserDelete(.....)
{
var user = repository.Fetch<User>(id);
repository.Remove(user);
repository.Connection.Commit();
}
// soft delete event listener
protected override void DeleteEntity(NHibernate.Event.IEventSource session, object entity, ..)
{
var repositoryEntity = entity as deletableentity;
if (repositoryEntity != null)
{
if (!repositoryEntity.IsDeleted)
{
// this marks the entity as deleted
repositoryEntity.isDeleted = true;
// cascade delete
this.CascadeBeforeDelete(session, persister, repositoryEntity, entityEntry, transientEntities);
this.CascadeAfterDelete(session, persister, repositoryEntity, transientEntities);
}
}
}
public void OnPostUpdate(PostUpdateEvent @event)
{
if (@event == null) throw new ArgumentNullException("event");
var entity = @event.Entity as deletableentity;
// Evict any entities that have been set as deleted from first level cache.
if (entity != null && entity.IsDeleted)
{
@event.Session.Evict(entity);
}
}
इसे हल करने के तरीके पर कोई विचार?
आपको बहुत बहुत धन्यवाद! – KeatsPeeks