我正在尝试决定访问数据库的最佳策略.我了解这是一个通用的问题,没有一个好的答案,但是我将提供一些有关我想要的指导方针. 在过去的几年中,我们一直在使用自己的持久性框架,尽管有限也有限.但是,它需要一些重大的改进,我想知道我应该这样做还是使用现有框架之一.我要寻找的标准是: 客户端代码应与干净的对象一起使用,宽度没有数据库知识.使用我们的自定义框架时,客户端代码看起来像: sessionmanager session = new SessionManager(); 订单订单= session.createentity(); order.date = dateTime.now; //设置其他属性 orderDetail详细信息= order.addorderDetail(); 细节.产品=产品; //其他属性 //立即提交所有更改 session.commit(); 应该尽可能简单而不是"太灵活".我们需要一种做大多数事情的方法. 应该在面向对象的编程方面得到很
以下是关于 nhibernate 的编程技术问答
我有一个通用的ASP.NET(MVC)应用程序,该应用程序使用NHIBERNATE作为模型持久层,而ASP.NET成员/角色/配置文件作为用户管理层. 问题是什么可以被视为在域数据和用户之间建立链接的最佳实践. (例如,我想创建一个论坛系统,我想将每个主题/帖子链接到特定用户,并希望按每个请求显示用户). 这些是我一直在想的posiibilites: 将用户ID存储在nhibernate中(例如,在所有域类(帖子,主题等)中使用一个需要参考用户的GUID列)并在每次需要从GUID(可能导致n+1个查询) b变体:或者也存储用户名. 使用相同的数据库,并创建一个仅读取的NHIBERNATE维护域对象用户,该对象用户映射到与M/R/P服务相同的数据. 忘记M/R/P,并基于NHIBERNATE创建单独的用户管理服务 忘记两者都使用J2EE/ROR/MERB/DJANGO/等. (请不要选择此选项:)) 其他... 解决方案 我会去第2步
好吧,我搜索了很多谷歌,并找到了同样的建议(将HBM设置为嵌入式资源,在Hibernate.cfg等上添加HBM等),尽管如此,我仍然没有得到. 让我解释一下:我为机票门设备编写了一个通信DLL,在那里我有一个配置模型类,我用来通过TCP/IP配置该设备.但是现在,我必须将这个对象坚持在DB上,因此我在模型中写了一个适配器,将一个适配器粘在另一个.这样,我有一个用于配置模型的适配器,该模型具有ID,包括日期等.让我们看看: DeviceConf模型类: public class DeviceConf : BaseModel // which have ID, IncludedDate, etc { private TGCommHelper.Entities.Configuration.TicketGateConfig _conf; public TGCommHelper.Entities.Configuration.TicketGateConfig con
是否有一种方法可以使用NHIBERNATE将枚举持续到DB?那是枚举中每个值的代码和名称的表. 我想在没有实体的情况下保留枚举,但仍有来自所有其他参考实体的外国密钥(枚举的INT表示). 解决方案 你们为什么要使这个问题复杂化?这真的很简单. 映射看起来像这样: 模型属性看起来像这样: public virtual OrganizationTypes OrganizationType { get; set; } 枚举看起来像这样: public enum OrganizationTypes { NonProfit = 1, ForProfit = 2 } nhibrenate将自动弄清一切.为什么输入比您需要的要多??? 其他解决方案 您可以直接使用枚举类型: http://web.archive.org/web/20100
我创建了一个应用程序(基于Web的应用程序),该应用程序现在具有大量关联.简而言之,一个帐户: 有许多用户 有设置 有许多项目 类似的项目: 有很多项目 用户: 有许多任务 等等,负载更多的关联.我希望没有什么特别的不寻常.我选择使用nhibernate给我一套不错的持续课程,其中映射器定义了所有关联. 但是这种方法对吗?在对应用程序的每个请求中,该帐户已加载(因为需要),然后请从DB请求大量数据.懒惰加载是一种选择,但我不知道我的初始方法是否再好不过了.我在那个阶段想要的就是帐户和关联的设置,所以映射应该反映出这一点吗?麻烦是我希望在其他方面类似于帐户的所有项目,因此我需要映射来反映所有关联. 我担心的是,懒惰加载可能只是弥补了我的初始体系结构.我很清楚,这可能只是我对NHIBERNATE内部运作的尚未了解的结果.结果,我将感谢有关良好实践的任何建议. 解决方案 域驱动的设计在理解这种情况时对我有很大帮助. 您应该在情况下问自
我可能会错过一些在波纹管代码中跟踪的东西,但是它正在减慢远程数据库服务器响应时间.应用程序可以正常工作,而从同一台计算机部署的机器进行了尝试.另外,使用NH-Profiler验证了所有NHIBERNATE任务.所有查询都受到控制.唯一的原因是数据库服务器的响应时间.另外,分析了DB服务器,服务器很好,但这是通过远程数据库服务器运行时唯一慢的应用程序. 以下是公共类,用于所有NHIBERNATE操作: public class CommonRepository : IDisposable { protected static Configuration Config; protected static ISessionFactory SessionFactory; protected static ITransaction Transaction; static readonly object Factor
下午好,我正在一个相当大的项目迁移到流利的Nhibernate,以与单声道一起使用.我的大部分关键功能都可以正常工作,但是我遇到了内存问题. 当前,此代码位于我的两个控制器中.这似乎并不是最佳的.但是我不确定要把它放在哪里. private static ISessionFactory CreateSessionFactory() { return Fluently.Configure() .Database(MySQLConfiguration.Standard.ConnectionString( c => c.FromConnectionStringWithKey("DashboardModels") )) .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) .Mappings(m => m.Fluent
目前,我们有一个实施互联网银行网站的项目,我们正在使用NHIBERNATE评估它. �NHibernate适合这种应用程序,在这种应用程序中,性能很重要,并且将同时进行大量用户进行操作? ¿ 我认为,只有在错误地使用时,NHIBERNATE才会放慢,我认为我们可以通过许多调整,最佳实践和常识来使用它. 更新:不久前我们与我们联系了该项目,我们仍在收集要求定义规格的要求.该应用程序是我国一家中小型银行的应用程序,因此他们期望同时拥有200至300个用户. 我很确定DB将在SQL Server 2005中,并且将是使用WebServices访问数据层的N层应用程序. 解决方案 我的团队在需要高通量的系统中使用Nhibernate多年来没有问题. NH从一开始就相当有效,并提供了对物体重组何时以及如何重组的细粒度控制. 话虽如此,我们不知道您的问题的细节,因此我们无法做出某些预测.提交自己之前,请执行缩放测试. 如果正确使用, 其他解决方案 NHIBER
我正在努力改善现有ASP.NET Web应用程序的数据量表层的性能.风景是. 它是基于Web的应用程序. dataAccess层是使用Nhibernate 1.2构建的,并以WCF服务暴露. 实体类用数据合同标记. 不使用懒惰的加载,由于急切的关系,因此在内存中加载了数据库对象的巨大.数据库的命中率也不高.例如,我使用NHProfiler对该应用程序进行了介绍,并使用主键加载一个实体对象之一. . 我也无法更改代码,因为它的现有实时应用程序根本没有Nunit测试案例. 请在这里得到一些建议吗? 编辑1:我尝试使用懒惰加载,但问题是,由于该实体也用作数据合同,因此它会触发序列化过程中的懒惰加载. 使用DTO对象是一种选择,但这是一个巨大的变化,因为没有实体很大.没有测试用例,这将需要大量的手动测试工作. 编辑2:该项目很久以后写了,没有灵活地编写单元测试.例如 实体本身包含CRUD操作并使用NHIBERNATE会话. class SampleEnti
我们正在研究基本上无法更改的一系列相同结构化的遗留数据库的不同集成.为此,我们添加了一个辅助数据库,用于保留诸如元信息,路由规则和临时保留旧数据库的数据. 我们主要使用NHIBERNATE连接到数据库.一个应用程序是WCF服务,需要将传入的数据插入真正宽的嵌套表中(数十列).显然,绩效是一个问题,因此我一直希望通过NHIBERNATE交易尽可能地经济.同时,并发似乎是一个问题.在生产中,我们开始遇到一些僵尸交易错误(僵局). 我一直在做平衡的行为来处理这两个问题,但并没有真正消除并发问题. 设置了服务行为以一次处理一个请求,例如: [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode=ConcurrencyMode.Single] public class LegacyGateService : ILegacyGateService 早些时候,在I
在某些情况下,创建一个较轻的实体版本是一个好主意,只是出于表现原因指向同一表,但映射列的列更少.例如,如果我有一个有50列的联系人表,并且在一些相关的实体中,我可能对firstName感兴趣,而LastName属性是创建轻量级版本的联系表的好主意.例如 public class ContactLite { public int Id {get; set;} public string FirstName {get; set;} public string LastName {get; set;} } 也可以将多个类映射到同一表? 解决方案 这不是一个好主意.相反,始终映射完整的类并创建可以使用Transformers.AliasToBean或linq的较小类. 后者的一个例子: var lightContacts = (from contact in session.Linq()
所以我在墙上的时刻有一个头,希望有人可以帮助卸下墙壁或阻止我的头移动! 在过去的3/4周中,我一直在研究一个新项目的ORM. ORM必须映射到现有的大型且老化的SQL数据库. 所以我尝试了亚音速.我真的很喜欢V2和V3与VB合作,并在SQL中任命Schemas运行正常.但是,它缺乏具有单独实体属性名称与列名称的灵活性使我拔出头发(对不起,Rob). 我尝试了实体框架,但我发现某些领域缺乏它. 所以我咬了子弹并尝试了NHIBERNATE,但是一周左右的时间后,我喜欢(在CodeSmith的帮助下为我生成类/HBMS),我对启动所需的时间感到沮丧(构建一个配置对象),尽管尝试了许多技巧来减少这段时间. 我本质上是在建立一个可以在应用程序和网站之间共享的DAL类之后.我在吠叫错误的树吗?对于一个带有100张桌子的旧项目,我应该回到ado.net并使用DTOS吗? aarrgh! 对不起,对问题的风格.我没有太多的头发,我想保留自己的东西! 预先感谢,E
我的公司正在从头开始重写现有的应用程序.此应用程序除其他任务外,还针对订单和发票数据执行复杂的SQL查询以生成销售报告.这些查询是根据用户选择的标准动态构建的,因此,如果选择了许多标准,则可以非常复杂.目前,性能是不错的,但不是很好. 现在,对于新版本,我们想使用一个ORM,可能是NHibernate,因为它显然是唯一支持Oracle Lite的ORM(应用程序使用Oracle或Oracle Lite,具体取决于它是在连接还是断开连接模式下运行的).但是我担心Nhibernate产生的查询性能.我之前曾与其他ORMS合作(Linq到SQL,实体框架),但是查询非常简单,因此没有性能问题. 所以,在我决定使用ORM或与Plain SQL呆的决定之前,我想知道这些工具如何处理诸如外部连接,subqueries等方案等...您是否认为是ORM(尤其是ORM) NHIBERNATE)适用于上述报告方案吗?我应该担心复杂查询的性能吗? 任何反馈都将不胜感激 解决方案 请参
嗨,我在自动映射器上有一些主要问题,而且速度很慢.我不确定如何加快速度. 我正在使用nhibernate,fluent nhibernate和asp.net MVC 3.0 [Serializable()] public class Test { public virtual int Id { get; private set; } public virtual string Name { get; set; } public virtual string Description { get; set; } public virtual DateTimeDate { get; set; } public virtual IList Reminders { get; set; } public virtual IList R
我听到的关于Nhibernate的懒惰加载的大部分是,使用它比不使用它更好.使数据库访问最小化似乎是有意义的,以减少瓶颈.但是很少有没有权衡的事情来实现,当然,它可以通过强迫您拥有virtual属性来略微限制设计.但是我也注意到一些开发人员在某些经常使用的对象上关闭懒惰加载. 这让我想知道是否在某些确定情况下,通过使用懒惰加载来伤害数据访问性能. 所以我想知道,在什么情况下,我应该避免延迟加载我的一个nhibernate persisted对象? 仅在额外的处理时间内延迟加载的缺点,还是可以增加懒惰的加载也会增加数据访问时间(例如,通过对数据库进行额外的往返旅程)? 谢谢! 解决方案 数据库中的急切和懒惰加载对象之间存在明确的性能权衡. 如果您使用急切的加载,则会在单个查询中吸取大量数据,然后可以缓存.这在应用程序启动时最常见.您正在将记忆消耗用于数据库往返. 如果您使用懒惰的加载,则在单个查询中吸收最少的数据,但是每当您需要与该初始数据相关的
我在我的MVC应用程序中有一个查询,大约需要20秒才能完成(使用Nhibernate 3.1).当我在管理工作室手动执行查询时,需要0秒. 我已经看到了类似于这个问题的问题,所以我进一步进行了测试. 我使用SQL Server Profiler拦截了查询,并在我的应用程序中使用ado.net执行了查询. 我从探查器中获得的查询类似于:" exec sp_executesql n'select ...." 我的ado.net代码: SqlConnection conn = (SqlConnection) NHibernateManager.Current.Connection; var query = @""; var cmd = new SqlCommand(query, conn); SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.Clos