我需要在 Nhibernate 不支持的 Get/Load 方法上应用过滤器。在获取/加载时应用过滤器的一些技术是什么。 我知道我可以修改 DefaultLoadEventListener 中的值。谁能推荐一些更好的技术?
最佳答案
您可以使用拦截器来实现这一点。以下代码在尝试获取对象时应用过滤条件。
代码的重要部分是重写 OnPrepareStatement 方法,它更改获取 SQL 以根据给定条件进行过滤。基于文本的匹配是一种相当粗糙的方法,但我希望你明白这一点。
public class TenantInterceptor : EmptyInterceptor
{
private ISession _session;
public override void SetSession(ISession session)
{
_session = session;
base.SetSession(session);
}
public override object GetEntity(string entityName, object id)
{
object entity = base.GetEntity(entityName, id);
if (entity != null && entity.GetType().IsAssignableFrom(typeof(User)))
{
var filter = _session.GetEnabledFilter("Tenant") as FilterImpl;
if (filter != null)
{
var filterValue = filter.Parameters["name"];
var user = entity as User;
if (!user.Tenant.Equals(filterValue))
return null;
}
}
return entity;
}
public override SqlString OnPrepareStatement(SqlString sql)
{
if (sql.ToString().EndsWith("FROM \"User\" user0_ WHERE user0_.Id=?"))
{
var filter = _session.GetEnabledFilter("Tenant") as FilterImpl;
if (filter != null)
{
var filterValue = filter.Parameters["name"];
sql = sql.Append(string.Format(" And user0_.Tenant = '{0}'",filterValue));
}
}
return base.OnPrepareStatement(sql);
}
}
关于c# - Nhibernate 的 Get 和 Load 方法不支持 session 过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28456015/