Tag: nhibernate

记录NHibernate SQL查询

有没有办法在我的代码中访问完整的SQL查询,包括值? 我能够使用log4net记录SQL查询: 但是,我想找到一种从代码中记录SQL查询的方法。 这样我将在try / catch语句中记录导致exception的特定SQL查询。 现在,我必须对SQLFileLog进行数据挖掘,以便在发生exception时找到导致exception的查询并且效率不高。

Linq,Expressions,NHibernate和Like比较

我试图做一个基于外部参数(通过搜索表单传递)的比较来确定比较类型( “%string”或”string%”或”%string%” ) 我正朝着以下方向思考: query = query.Where( Entity.StringProperty.Like(“SearchString”, SelectedComparsionType) ) 类似方法将比基于所选类型返回.StartsWith()或.EndsWith()或.SubString() 我对表达式的了解显然远远不够,因为我无法构造一个可以产生正确结果的方法(SQL中的服务器端比较与StartsWith方法一样)。

NHibernate.LazyInitializationException

我们偶尔会出现这个问题,但现在我每次都可以重现它。 我在自定义构建的论坛上增加了一个视图计数器,这会导致错误: NHibernate.LazyInitializationException:无法懒惰地初始化集合,没有会话或会话被关闭 在对象中的另一个集合上发生此错误。 如果我添加: .Not.LazyLoad() 对于我的Fluent映射,错误在我的项目周围移动。 我一直禁止对对象的延迟加载,直到它没有延迟加载的地方,然后它抛出了这个错误: NHibernate.LazyInitializationException:无法初始化代理 – 没有会话。 所以,然后我在懒惰的装载上取出了遗嘱,现在我又恢复了原点。 当我递增此视图计数器时,它只会出错。 这是我的基类保存代码的片段: using (ISession session = GetSession()) using (ITransaction tx = session.BeginTransaction()) { session.SaveOrUpdate(entity); tx.Commit(); } 环顾四周,我在另一篇文章中读到这些交易可能会导致问题,但这是因为它们被放置在哪里。 此代码扩展到与我的域对象(存储库类)分开的类。 这是post: hibernate:LazyInitializationException:无法初始化代理 我不相信这是我的问题。 这是第一个抛出错误的集合的流畅映射。 还有其他几个类似的集合。 HasManyToMany(x => x.Votes) .WithTableName(“PostVotes”) .WithParentKeyColumn(“PostId”) .WithChildKeyColumn(“VoteId”);

多列多对一

我有一个遗留数据库和两个表之间的一对一关系。 关键是关系使用两列,而不是一列。 有没有办法在nhibernate中说,当获取一个被引用的实体时,它在join语句中使用了两列,而不是一个? 我有一个类似的表结构 TaskProgress ProgressId 任务id AssignmentId 用户身份 任务 任务id AssignmentId 任务名称 每个任务都可以在不同的任务中进行分配。 这意味着任务进度的唯一任务只能由AssignmentId和TaskId字段建立。 我想用这个: References(x => x.Template) .Columns() .PropertyRef() 但无法获得如何在多列上映射连接,任何想法?

Fluent-NHibernate是否支持映射到程序?

我一直想知道是否可以让Fluent-NHibernate与已经存在的存储过程进行通信,并将结果集中的映射分配给我自己的域对象。 也是Fluent-NHibernate能够直接执行没有返回结果集的程序吗? 基本上我一直在考虑使用Fluent-NHibernate来替换具有域驱动设计的日期TypedDataSet模型的含义,该设计可以从DAL返回简单对象。 如果Fluent-NHibernate不能轻松使用SP,我想我最喜欢的是一个组合DAL,它将利用FNH进行简单的CRUD操作,同时让复杂的程序由Enterprise Library管理。 虽然如果FNH不能很好地与SP配合使用,我认为拥有2个竞争DAL并不是最佳选择,我希望听到任何其他想法,而不是同时使用EntLib和FNH。

NHibernate一对一映射

我是NHibernate的新手所以到目前为止我对映射等的接触有限,而且我刚刚遇到了一个需要帮助的场景。 我有2张桌子: 评论TaggedReviews 我有两个看起来像这样的类(为简洁起见我排除了非重要属性): 评论 public virtual int ReviewId { get; set; } public virtual TaggedReview TaggedReview { get; set; } public virtual string Title { get; set; } public virtual string Descrip { get; set; } TaggedReview public virtual int ReviewId { get; set; } public virtual Review Review { get; set; } public […]

NHibernate会话管理?

首先,让我简要介绍一下这个场景。 我正在编写一个简单的游戏,其中几乎所有工作都在服务器端完成,并且有一个瘦客户端供玩家访问。 玩家登录或创建帐户,然后可以通过在网格中移动来与游戏交互。 当他们进入一个小区时,他们应该被告知该小区中的其他玩家,同样地,该小区中的其他玩家将被告知该玩家进入该小区。 可以进行许多其他交互和操作,但是不值得详细介绍它们,因为它更加相同。 当玩家退出然后重新登录或者如果服务器停机并重新启动,则所有游戏状态都应该持续存在,但是如果服务器崩溃,那么如果我失去10分钟左右的更改则无关紧要。 我已经决定使用NHibernate和一个SQLite数据库了,所以我在NHibernate上阅读了很多内容,按照教程和编写了一些示例应用程序,我对如何应对这个问题感到非常困惑! 我的问题是:管理会话的最佳方式是什么? 只是从我理解的少量,所有这些可能性跳出来对我: 拥有一个始终打开的会话,所有客户端都使用该会话 为每个连接并定期刷新它的客户端设置一个会话 每次我必须使用任何持久化实体时打开一个会话,并在更新,插入,删除或查询完成后立即关闭它 为每个客户端建立一个会话,但保持断开状态,只有在需要使用它时才重新连接 与上面相同,但保持连接状态,并在一段时间不活动后才断开连接 保持实体分离,并且每隔10分钟仅附加一次,例如,提交更改 我可以使用什么样的策略来获得不错的性能,因为每秒可能有数百个客户端可能会有很多更新,插入,删除和查询,而且它们都必须相互一致? 另一个小问题:我应该如何以有效的方式使用交易? 是否可以将每一次更改都放在自己的事务中,或者当我有数百个客户端都在尝试更改网格中的单元格时,这种情况会不会很糟糕? 我是否应该尝试弄清楚如何将类似的更新批量放在一起并将它们放在一个单独的事务中,还是会变得太复杂? 我甚至需要大部分交易吗?

如何安全地配置数据库连接

相似但不一样: 如何安全存储数据库连接详细信息 安全地连接到应用程序中的数据库 大家好,我有一个连接到数据库服务器的C#WinForms应用程序。 数据库连接字符串(包括通用用户/传递)放在NHibernate配置文件中,该文件与exe文件位于同一目录中。 现在我遇到了这个问题:运行应用程序的用户不应该知道普通数据库用户的用户名/密码,因为我不希望他直接在数据库中搜索。 或者,我可以对连接字符串进行硬编码,这是不好的,因为管理员必须能够在移动数据库时更改它,或者如果他想在dev / test / prod环境之间切换。 很久以来我发现了三种可能性: 通常通过使文件仅对运行应用程序的用户可读来回答第一个引用的问题。 但在我的情况下这还不够(运行应用程序的用户是一个人。数据库用户/通行证是一般的,甚至不应该被人访问。) 第一个答案还建议在将连接数据写入文件之前加密连接数据 。 使用这种方法,管理员不再能够配置连接字符串,因为他无法手动加密。 第二个引用的问题为这种情况提供了一种方法,但它似乎非常复杂。 我向你提问: 这是一个非常普遍的问题,所以没有任何一般的“怎么做”的方式,不知何故是一种“设计模式”? .NET的配置基础架构是否有一些支持? (可选,可能超出范围)我可以轻松地将其与NHibernate配置机制相结合吗? 更新: 回答第一个答案:有几个原因我想直接连接到数据库而不是使用Web服务 : (N)Hibernate只能用于数据库,而不能用于web服务(对吗?) 我们计划提供离线function,即如果数据库或网络应该关闭,用户可以继续他的工作。 为了解决这个问题,我正在考虑拥有一个本地的进程内数据库,例如SQL Server Compact,并使用MS Sync框架在它再次启动时立即与服务器数据库同步。 您是否有任何进一步的想法考虑到这一点?

如何实现历史版本控制?

我们正处于构建SQL 2008 R2上的大型C#MVC2应用程序(我们还将Sharp架构和Nhibernate作为生态系统的一部分)的早期阶段,其中一个要求是所有数据库行版本都可以在给定的时间内访问历史。 我们玩弄了类似于以下布局的想法: id(PK) 的recordId VERSIONID 并且使用相同的recordId和增加的versionId创建新记录中的每个编辑记录结果。 然后记录显示将按照SELECT … WHERE recordId = X AND versionId = MAX(versionId)的内容完成。 每个事务的快照都不起作用(太多了?并且无法从应用程序中轻松访问)。 但我们很好奇其他实施方案是否成功,或者我们的提案存在潜在问题。

.NET 4 ISet HashSet 可以替换NHibernate Iesi.Collections ISet,HashSet吗?

.NET 4 ISet HashSet 可以替换NHibernate Iesi.Collections ISet,HashSet吗? 我正在使用Castle代理和NHibernate 3.0。