gpt4 book ai didi

c# - Nhibernate 的 Get 和 Load 方法不支持 session 过滤器?

转载 作者:行者123 更新时间:2023-11-30 18:26:32 25 4
gpt4 key购买 nike

我需要在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com