asp.net-mvc – NHibernate和上下文实体
我正在尝试将NHibernate用于带有旧数据库的新应用程序.它运行得很好,但我陷入困境,无法找到解决问题的好方法.
假设我有这个模型: >服务表(Id,ServiceName ..) 所以我绘制了这个并且一切顺利.现在我可以检索一部电影,获取所有相关的内容,…… 我想了几个解决方案: >将服务条件添加到我的所有查询中.会工作,但它有点麻烦.该模型非常复杂,有大量的表/查询.. 这些都不能让我满意.有没有办法做到这一点? 谢谢 ! 解决方法
您询问的是同一数据库中所有租户的多租户问题.我使用Ninject依赖注入有效地处理了这种情况.在我的应用程序中,租户被称为“手动”,我将在示例代码中使用它.
该路线需要包含租户,例如 {manual}/{controller}/{action}/{id} 可以在租户上设置约束以限制允许的租户. 我使用Ninject配置和提供ISessionFactory作为单个和ISession in session-per-request策略.这是使用Ninject Provider类封装的. 我使用轻量级存储库类进行过滤,例如 public class ManualRepository { private readonly int _manualId; private readonly ISession _session; public ManualRepository(int manualId,ISession session) { _manualId = manualId; _session = session; } public IQueryable<Manual> GetManual() { return _session.Query<Manual>().Where(m => m.ManualId == _manualId); } } 如果你想要漂亮的网址,你需要将租户路由参数转换为相应的数据库值.我在web.config中设置了这些,并在启动时将它们加载到字典中. IRouteConstraint实现读取“手动”路由值,查找它,并设置“manualId”路由值. Ninject可以处理将ISession注入存储库并将存储库注入控制器.控制器操作中的任何查询都必须基于存储库方法,以便应用过滤器.诀窍是从路由值注入manualId.在NinjectWebCommon中,我有两种方法可以完成此任务: private static int GetManualIdForRequest() { var httpContext = HttpContext.Current; var routeValues = httpContext.Request.RequestContext.RouteData.Values; if (routeValues.ContainsKey("manualId")) { return int.Parse(routeValues["manualId"].ToString()); } const string msg = "Route does not contain 'manualId' required to construct object."; throw new HttpException((int)HttpStatusCode.BadRequest,msg); } /// <summary> /// Binding extension that injects the manualId from route data values to the ctor. /// </summary> private static void WithManualIdConstructor<T>(this IBindingWithSyntax<T> binding) { binding.WithConstructorArgument("manualId",context => GetManualIdForRequest()); } 并声明存储库绑定以注入manualId.通过惯例可能有更好的方法来实现这一目标. kernel.Bind<ManualRepository>().ToSelf().WithManualIdConstructor(); 最终结果是查询遵循模式 var manual = _manualRepository .GetManual() .Where(m => m.EffectiveDate <= DateTime.Today) .Select(m => new ManualView { ManualId = m.ManualId,ManualName = m.Name }).List(); 我不需要担心在我的查询中过滤每个租户. 至于二级缓存,我不在这个应用程序中使用它,但我的理解是你可以设置缓存区域来隔离租户.这应该让你开始:http://ayende.com/blog/1708/nhibernate-caching-the-secong-level-cache-space-is-shared (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET表单认证在iPad上显示登录页面
- asp.net-mvc-3 – .NET MVC 3自定义控制器属性
- asp.net核心 – 无法使用托管代理在Visual Studio Team Ser
- asp.net – 如何以编程方式触发dropdownlist.selectedindex
- asp.net – 更改事件和IE8的jQuery问题
- asp.net-mvc – Kendo:处理Ajax数据请求中的错误
- Asp.Net 不同的OnClick事件区别小结(onserverclick,onclien
- asp.net – 如何在volusion中编辑产品详细信息页面
- asp.net-mvc – 如何在ASP.NET MVC中添加路由到动态robots.
- asp.net-mvc-3 – 将开源CMS框架集成到现有的MVC3 / MVC4站