Tôi có một người dùng có một số vai trò. Người dùng được liên kết với các vai trò bằng cách sử dụng bảng thực thể liên kết. Tôi đã thiết lập các tập tin cấu hình để thác xóa các thực thể liên kết vai trò người dùng khi người dùng bị xóa.Tại sao Session.Evict trong OnPostUpdate gây ra ngoại lệ "Có thể nonthreadsafe truy cập vào phiên"?
Chúng tôi hiện đang sử dụng xóa mềm để xóa đối tượng. Chúng tôi đã thêm trình xử lý sự kiện xóa mềm được kích hoạt bởi xóa. Khi một thực thể bị xóa, nó sẽ kích hoạt sự kiện DeleteEntity
đánh dấu thực thể là đã xóa.
Chúng tôi cũng có ghi đè sự kiện OnPostUpdate
để xóa các thực thể khỏi bộ nhớ cache bằng cách gọi Evict trên thực thể.
Nếu tôi tạo người dùng mà không có bất kỳ vai trò nào, sau đó xóa nó, mọi thứ hoạt động tốt (nó cũng hoạt động nếu bị vô hiệu hóa thác). Tuy nhiên nếu tôi có một người dùng với ít nhất một vai trò được giao và tôi xóa người dùng, sau khi cuộc gọi đến Evict trong OnPostUpdate
, tôi nhận được một ngoại lệ NHibernate "NHibernate.AssertionFailure: Có thể nonthreadsafe truy cập vào phiên".
Tôi đã thử, trong OnPostUpdate
, để sử dụng phiên con để Loại bỏ thực thể, ngoại lệ không được ném, tuy nhiên, pháp nhân không bị đuổi.
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);
}
}
Mọi ý tưởng về cách giải quyết?
cảm ơn bạn rất nhiều! – KeatsPeeks