Tag: nhibernate

使用NHibernate部分填充子集合

我一直在努力解决这个问题,似乎无法弄明白…… 我有一个BlogPost类,它有一个Comments集合,每个注释都有一个DatePosted字段。 我需要做的是查询BlogPost并返回部分加载的Comments集合,比如2009年8月1日发布的所有评论。 我有这个问题: BlogPost post = session.CreateCriteria() .Add(Restrictions.Eq(“Id”, 1)) .CreateAlias(“Comments”, “c”) .Add(Restrictions.Eq(“c.DatePosted”, new DateTime(2009, 8, 1))) .UniqueResult(); 当我运行此查询并检查生成的sql时,它首先针对BlogPost表运行查询,连接到具有正确日期限制的Comment表,然后在Comment表上运行第二个查询,返回所有内容。 结果是BlogPost类的Comments集合完全填满了! 我究竟做错了什么? 如果有人需要更多信息,我有代码示例……!

NHibernate批量插入或更新

嗨,我正在开发一个项目,我们需要每天处理几个xml文件,并使用这些文件中包含的信息填充数据库。 每个文件大约1Mb,包含大约1000条记录; 我们通常需要处理12到25个这些文件。 我已经看到有关使用NHibernate的批量插入的一些信息,但我们的问题有点棘手,因为xml文件包含与更新记录混合的新记录。 在xml中有一个标志,告诉我们特定记录是新记录还是对现有记录的更新,但不是更改了哪些信息。 xml记录不包含我们的数据库标识符,但我们可以使用xml记录中的标识符来唯一地定位数据库中的记录。 到目前为止,我们的策略是识别当前记录是插入还是更新,并且基于我们在数据库上执行插入或者我们进行搜索,然后我们使用来自的信息来更新对象的信息。 xml记录,最后我们对DB进行更新。 我们当前的方法存在的问题是我们遇到了DB锁的问题,而且我们的性能下降得非常快。 我们已经考虑了一些替代方案,比如为不同的操作设置单独的表,或者甚至是单独的DB,但是做出这样的举动意味着要做出很大的努力,所以在我想要就这个问题征求社群意见的任何决定之前,先谢谢。

你能在nhibernate的一个会话中发生多个事务吗? 这是一个坏主意吗?

我正在考虑为NHibernate持久层创建自己的IUnitOfWork实现。 似乎正确的方法是在构造函数中实例化ISession和ITransaction ,然后在析构函数或Dispose()方法中进行Dispose() 。 当然,如果有人调用Save()方法,那么ISession将被刷新并且ITransaction将完成,因此在调用Save() ,将再次没有有效的打开事务来Save() …除非我提交了第一笔交易并立即开启了另一笔新交易。 但这是个好主意吗? 在设计方面,进行一次提交操作是有意义的,但我不一定能控制代码,而其他开发人员可能对遵循UnitOfWork模式不那么严格。 通过尝试使UnitOfWork容忍每个会话的多个事务,我会失去/获得任何东西吗? 我应该检查一个打开的事务,如果它已经被提交则抛出exception,而不是进行新的事务吗?

Nhibernate session.BeginTransaction()与transaction.Begin()

我的问题与使用nhibernate事务有关 transaction.Begin()下面是一个问题吗? 还是多余的? using (var transaction = session.BeginTransaction()) { transaction.Begin(); action(); transaction.Commit(); }

nHibernate QueryOver中的GROUP BY和HAVING子句

我正在尝试用nHibernate QueryOver语言编写这个特定的sql查询,我不是很熟悉: SELECT MessageThreadId FROM MessageThreadAccesses WHERE ProfileId IN (arr) GROUP BY MessageThreadId HAVING COUNT(MessageThreadId) = arr.Count 其中arr是一个整数数组(用户ID)我作为参数传递,而MessageThreadAccess实体如下所示: public virtual MessageThread MessageThread { get; set; } public virtual Profile Profile { get; set; } …. 在阅读了多个堆栈溢出线程并进行实验后,我得到了我的查询(尝试获取MessageThread对象 – 它应该总是只有一个或没有),但它仍然无法工作,我不确定还有什么可以尝试。 查询似乎总是返回MessageThreadAccess对象,但是当读取它的MessageThread属性时,它总是为NULL。 var access = Session.QueryOver() .WhereRestrictionOn(x => x.Profile).IsIn(participants.ToArray()) .Select(Projections.ProjectionList() .Add(Projections.Group(x => x.MessageThread)) ) .Where( Restrictions.Eq(Projections.Count(x => x.MessageThread.Id), […]

使用DDD创建子实体的正确方法

我是DDD世界的新手,在阅读了几本关于它的书之后(其中包括Evans DDD)我无法在互联网上找到我的问题的答案:用DDD创建子实体的正确方法是什么? 你看,互联网上的很多信息都在一些简单的层面上运作。 但是细节上的恶魔并没有为了简单起见而在数十个DDD样本中省略它们。 我在stackoverflow上来自我在similair问题上的回答 。 我对这个问题的看法并不完全满意,所以我认为我需要详细说明这个问题。 例如,我需要创建代表汽车命名的简单模型:公司,模型和修改(例如,日产天籁2012 – 将是“日产”公司,“天籁”模型和“2012”修改)。 我想要创建的模型的草图如下所示: CarsCompany { Name (child entities) Models } CarsModel { (parent entity) Company Name (child entities) Modifications } CarsModification { (parent entity) Model Name } 所以,现在我需要创建代码。 我将使用C#作为语言,将NHibernate用作ORM。 这很重要,通常在互联网上的大量DDD样本中没有显示。 第一种方法。 我将从通过工厂方法创建典型对象的简单方法开始。 public class CarsCompany { public virtual string Name { get; protected set; } public virtual […]

是否可以创建一个通用的Session.QueryOver ?

出于好奇,可以使用NHibernate 3做这样的事情吗? public IQueryable FindAll() { return Session.QueryOver().List().AsQueryable(); } 我得到一个编译错误,说像…… 类型T必须是引用类型才能将其用作参数T. 我想知道我是否可以创建一个Session.QueryOver的扩展方法来处理generics类型。 我可以用类似的东西替换它 return Session.CreateCriteria(typeof (T)).List().AsQueryable(); 但是热衷于使用查询api的function。 有任何想法吗? 也许缺少明显的东西!

Nhibernate Session 01的夏天,为什么我得到NHibernate.Bytecode.ProxyFactoryFactoryNotConfiguredException?

我是全新的NHibernate,跟随www.summerofnhibernate.com的截屏video,非常棒。 在演示结束时,unit testing应该通过,但对我来说它说: NHibernate.Bytecode.ProxyFactoryFactoryNotConfiguredException: The ProxyFactoryFactory was not configured. 我究竟做错了什么?

如何在NHibernate中克隆对象?

如何在NHibernate中实现克隆的对象(实体)? 每个实体类都有这样的属性: public virtual IList Clubs { get; set; } 此外,实体类inheritanceBaseObject。 我尝试使用XML序列化来实现解决方案,但是不可能序列化接口。 谢谢您的回答!

当两个类具有相同名称但名称空间不同时,NHibernate DuplicateMappingException

我的域模型root中有一个类,如下所示: namespace Domain { public class Foo { … } } 我还在另一个名称空间中有另一个具有相同名称的类: namespace Domain.SubDomain { public class Foo { … } } 对于我的映射,我有一个Mapping目录,其子目录名为SubDomain ,其中包含Domain.SubDomain命名空间中找到的域类的映射。 他们都在同一个集会中。 但是,当我尝试使用NHibernate加载它们时,我不断收到DuplicateMappingException …即使两个Foos都有不同的命名空间。 我用来加载我的NHibernate配置的代码是这样的: var cfg = new Configuration() .Configure() .AddAssembly(“Domain”); 我如何告诉NHibernate让我使用两个具有相同名称(但名称不同的名称空间)的实体?