Rhino.Security リポジトリを使用してユーザー/ロールを管理しています。
作成、削除、および関連付けのプロセスは正常に機能しますが、GetAssociatedUsersGroupFor という 1 つのメソッドを使用してクエリを実行すると問題に直面します。
メソッドを初めて呼び出すと、ユーザーのグループを取得できません。これは、まだ関連付けを作成していないためです。この時点で、ユーザーをいくつかのグループに関連付けます。
DB をチェックインすると、関連付けが表示されます。
GetAssociatedUsersGroupFor をもう一度呼び出しますが、グループを取得できません。
プロファイラーを使用すると、今回はデータベースが関与していないことがわかりました。コードを確認したところ、関数が Nhibernate SetCacheable を使用していることがわかりました。
public virtual UsersGroup[] GetAssociatedUsersGroupFor(IUser user)
{
ICollection<UsersGroup> usersGroups =
SecurityCriterions.AllGroups(user)
.GetExecutableCriteria(session)
.AddOrder(Order.Asc("Name"))
.SetCacheable(true)
.List<UsersGroup>();
return usersGroups.ToArray();
}
Rhino.Security コードを変更したくないので、この動作を何らかの方法でオーバーライドまたは変更できるかどうかを知りたいです。
アップデート:
この命令を使用して、関連付けられたグループを取得します。
AuthorizationRepository.GetAssociatedUsersGroupFor(User);
私はこのコードに関連付けます:
AuthorizationRepository.AssociateUserWith(User, grpName);
そして切り離します:
AuthorizationRepository.DetachUserFromGroup(User, groupToRemove.Name);
アップデート
構成に第 2 レベルのキャッシュを残していたことがわかりました。
<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache</property>
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>
パフォーマンスを向上させるために、II レベルのキャッシュを持つことは良いことだと思っていましたが、完全に間違っていたようです。
ここで何が起こっているのかを理解するのを手伝ってくれる人はいますか?