Tag: nhibernate

使用Moq模拟nHibernate QueryOver

测试时,以下行以空引用失败: var awards = _session.QueryOver().Where(x => x.BusinessId == (int)business).List(); 我的测试是这样的: var mockQueryOver = new Mock<IQueryOver>(); mockQueryOver.Setup(q => q.List()).Returns(new List {_awardingBody}); _mockSession.Setup(c => c.QueryOver()).Returns((mockQueryOver.Object)); _mockCommandRunner = new Mock(); _generator = new CertificateGeneratorForOpenSSLCommandLine(_mockSession.Object, _mockCommandRunner.Object, _mockDirectory.Object, _mockFile.Object, _mockConfig.Object); 老实说,我在黑暗中徘徊 – 我对nHibernate和Moq相对较新,所以我不太确定谷歌要获取正确的信息。

从nHibernate获取执行的SQL

我正在使用nHibernate ICriteria来执行查询,我希望能够获得在语句运行后执行的SQL。 所以例如我有类似的东西。 ISession session = NHibernateSessionManager.Instance.GetSession(); DetachedCriteria query = BuildCriteria(); // Goes away and constructs the ICriteria var result = query.GetExecutableCriteria(session).List() // somehow here get the sql that was just run string sql = query.GetSqlSomehow(); 我知道我可以记录它并在日志中看到sql,但我想在执行语句后立即获取它,这样我就可以向用户显示SQL(即使它看起来不太好)。

WCF / S#arpArch:在请求中的第一次调用之后,底层ISession将关闭

我知道在SA中使用WCF已被弃用,因为它将转移到SA Contrib。 但是直到它有,我想我必须使用SA中的支持。 也就是说,我在调用WCF服务后关闭了底层的NHibernate会话。 我的存储库的DbContext.Session在第一次调用后关闭,因此在单个HTTP请求期间我不能多次调用我的服务。 我基于Northwind示例应用程序在我的项目中设置了WCF。 该示例仅在每个请求中调用一次WCF服务,因此此问题不会显示在那里。 但是,通过复制TerritoriesController中的以下行,可以轻松复制该问题: territories = territoriesWcfService.GetTerritories(); 这会抛出一个ObjectDisposedException:“Session is closed!Object name:’ISession’”。 有任何想法吗?

如果实体处于某种状态,如何强制执行约束(如任何字段(或特定字段))不得更改?

我正在尝试在我当前的项目中使用DDD(c#,mvc,nhibernate,castle),我正在考虑检查一个约束的最佳方法,即如果实体处于某种状态,则任何字段(或特定字段)都不得更改,即。 已预订的发票(州=已预订)不得更改金额字段。 在服务层我得到一些我需要映射到域对象的DTO对象(来自gui或web服务等)。 映射完成后,我想validation我的对象 – 特别是我想检查我的问题中的具体约束。 目前我在考虑: 跟踪实体级别的更改,即在每个setter添加字段到更改的字段集合,并切换NHibernate以使用字段访问策略。 如果不允许更改值,则此模式的变化是在setter上抛出exception 在映射之前创建对象的副本以及比较原始值和映射值 回到nhibernate并从nhibernate会话中获取此信息 – 但是规则将不会在实体级别强制执行(imho it break ddd) 你怎么看待这件事? 你知道这个有什么好的模式吗? 或者我错过了什么,我需要改变我对这种约束的思考方式? 在此先感谢您的帮助。

NHibernate映射 – 一对一(或一对零)

NHibernatians! 我有一张桌子[dbo]。[Wibble]和另一张桌子[dbo]。[WibbleExtended]。 [Wibble]是主表,[WibbleExtended]是一个可选表,其中存储了一些其他字段。 [WibbleExtended]表中的条目远少于主[Wibble]表。 我认为这是在当天完成的,以解决一些空间问题(Wibble有很多行,而WibbleExtened有很多列)。 每个表的ID都是相同的,来自外部源。 即 [dbo].[Wibble].[WibbleId] 和 [dbo].[WibbleExtended].[WibbleId] 是相同的,这两个表是如何相关的。 NB我无法更改架构。 我把它变成了一个我几乎无法控制的遗留系统。 在它周围搜索似乎一对一映射是有问题的,并且流行的智慧是使用两个多对一映射。 我的映射目前是: 和 这个问题是我遇到了诸如此类的错误 System.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n. 我环顾四周,这看起来像是正确的策略,它只是落在最后的障碍。 问题是id生成器吗? 映射的其他方面? 正确答案的免费碎肉馅饼。 编辑:好的 – 这就是我通过@James Gregory解决这个问题的方法。 将unit testing从WibbleExtended测试移至Wibble测试类并进行必要的修改。 在Wibble.hbm.xml中添加了以下内容 为Wibble POCO添加了相应的属性。 删除了与WibbleExtended相关的所有代码。 运行测试,全部通过,签入。构建通过。 去了一个圣诞节啤酒(因此,在我更新这个之前已经过了几天!:-))

没有会话绑定到当前上下文

我遵循了这个教程: http : //nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx 在尝试加载页面时,我没有得到“没有绑定到当前上下文的会话”错误(mvc 3)。 public static ISessionFactory BuildSessionFactory() { return Fluently.Configure() .Database(MsSqlConfiguration.MsSql2008 // .ConnectionString(@”Server=.\SQLExpress;Database=db1;Uid=dev;Pwd=123;”) .ShowSql()) //.ExposeConfiguration(c => c.SetProperty(“current_session_context_class”, “web”)) //.CurrentSessionContext() .Mappings(m => m.FluentMappings .AddFromAssemblyOf()) .ExposeConfiguration(cfg => new SchemaExport(cfg) .Create(false, false)) .BuildSessionFactory(); } 实际错误在我的Repository.cs文件中: 第114行:公共虚拟T Get(int id)第115行:{第116行:return _sessionFactory.GetCurrentSession()。Get(id); 第117行:}第118行: 当我调试它时,_sessionFactory不是null或者任何东西,它似乎无法找到绑定的会话。 我在我的web.config中连接了httpmodule,它确实运行,所以这不是问题。 在我的nhibernate配置中,我尝试了两种方法: .ExposeConfiguration(c => c.SetProperty(“current_session_context_class”, “web”)) 和 .CurrentSessionContext() 但那没用。

什么是最好的NHibernate缓存L2提供商?

我见过他们中有很多。 NCache,Velocity等等,但我没有找到比较它们的表格。 考虑以下标准,最好的是什么: 容易明白。 最近一直在维护。 是免费的还是有足够好的免费版本。 作品。

Equals和GetHashCode中的延迟加载的NHibernate属性

如何处理以下问题? 我们正在使用延迟加载的NHibernate属性,每当我们调用Equals()或GetHashCode()任何使用的属性都将延迟加载,可能导致一系列延迟加载操作。 可以使用预先加载作为替代方案,但我认为仅在特定情况下而不是作为一般解决方案。 典型情况如下: public class AbstractSaveableObject { [Id(0, Name = “Id”, UnsavedValue = null)] [Generator(1, Class = “native”)] public virtual long? Id { get; set; } } [Class(NameType = typeof(ClassA))] public class ClassA : AbstractSavableObject { [Bag(0, Inverse = true, Cascade = “none”)] [Key(1, Column = “ClassA”)] [OneToMany(2, ClassType = typeof(ClassB))] public virtual ICollection […]

将断开连接的对象附加到NHibernate会话; 最佳实践?

我的存储库在UnitOfWork模型中工作; 所有操作,无论是检索还是持久性,都必须在IDisposable UnitOfWork令牌对象的范围内执行,后者在后台与执行所请求工作的Session相关联。 所以,基本模式是: using (var uow = repo.BeginUnitOfWork()) { try { //DB operations here; all repo methods require passing in uow. … repo.CommitUnitOfWork(uow); } catch(Exception) { repo.RollbackUnitOfWork(uow); throw; } } 我还实现了一些包装器方法,允许您指定将在此框架中执行的lambda或委托,从而减少每次都要实现所有这些脚手架的需要。 我遇到的问题是使用这个模型,代码必须“知道”用户需要什么,并在UnitOfWork使用NHUtil.Initialize()急切加载它。 一旦UOW被置于使用块的末尾,与任何PersistentBags相关联的Session就会被关闭,因此无法对它们进行评估。 由于急切加载所有事情并不总是可行的,并且有点破坏了延迟加载ORM的目的,我正在实现一个Attach()方法。 这是问题; 在没有内置的ISession.Attach()方法的情况下,我看到有三种方法建议将对象与新的Session相关联。 完成这项工作的最佳做​​法是哪一项? A: if(!Session.Contains(domainObject)) Session.Update(domainObject); B: Session.Merge(domainObject); C: Session.Lock(domainObject, LockMode.None);

如何根据实体输入参数过滤IEnumerable

我正在使用现在的entity framework – 但它是所有ORM甚至IEnumerable之间“共享”的问题。 假设我在MVC中有一个方法如下所示: [HttpPost] public ActionResult Foo(FooModel model) { var context = new Context(); — The EF session var data = context.Foo.Where(???).ToList(); return View(data); } 我想根据输入参数查询上下文,如: var data = context.Foo.Where(x => x.Date == model.Date && x.Name == model.Name && x.ItemCode = model.ItemCode).ToList(); 但它比这更复杂,因为如果上面的一个参数( Date \ Name \ ItemCode )为null,我不想将它包含在查询中。 如果我硬编码它看起来像这样: var query = […]