Tag: fluent nhibernate

NHibernate标准与不同的父负载所有孩子?

我有一个父子关系,我想只返回一个父母并加载所有孩子。 我正在使用标准,因为它是一个动态查询。 var messageQueueId = this.GetPropertyName(x => x.Id); var query = _sessionManager.Session.CreateCriteria(QUEUE_ALIAS); query.SetFirstResult(_pageOffset); query.SetMaxResults(_pageSize); query.Add(Restrictions.In(messageQueueId, _messageQueueIds)); query.List(); 这将返回父(MessageQueue),但不返回它的子(SearchMatches)。 当我尝试这样做时: var query = _sessionManager.Session .CreateCriteria(QUEUE_ALIAS) .CreateAlias(this.GetPropertyName(x => x.SearchMatches) , MATCH_ALIAS, JoinType.LeftOuterJoin); 然后我让孩子们装满了,但我也收到了重复的父母。 我理解为什么会这样。 但是我不明白如何让第一个场景自动加载SearchMatches? 以下是我的权利: public class MessageQueue : EntityBase { … public virtual IList SearchMatches { get; set; } … } public class SearchMatch : […]

NHibernate HQL内部连接(SQL Server,Visual C#)

我想在内部Join中使用HQL。 但是,抛出了查询语法exception。 这是我的C#代码: string sqlQuery = “Select fq FROM Answers as fq INNER JOIN Questions as q ” + ” on fq.questionId=q.questionId”; IList Result; int count = 0; try { using (ISession session = ConnectionModule.OpenSession()) { IQuery query = session.CreateQuery(sqlQuery); session.CreateCriteria(typeof(Answers)); Result = query.List(); } } catch(Exception ex) { MessageBox.Show(ex.Message+”\n”+ex.InnerException); }

视图exception后的Nhibernate Lazy Loadexception

我用NHibernate和Fluent配置得到一个奇怪的行为。 每当发生与NHibernate无关的genericsexception时,即在视图中, DivideByZeroException抛出exception后的每个请求。 An exception of type ‘NHibernate.LazyInitializationException’ occurred in NHibernate.dll but was not handled in user code. Additional information: Initializing[Entity]-Could not initialize proxy – no Session. 由于bug的性质,bug是至关重要的,因为如果1个用户生成exception,则可以使整个网站死亡 接下来是我的HttpModule for Nhibernate和Asp.Net MVC 5来处理会话。 NHibernateSessionPerRequest.cs public class NHibernateSessionPerRequest : IHttpModule { private static readonly ISessionFactory SessionFactory; // Constructs our HTTP module static NHibernateSessionPerRequest() { SessionFactory = […]

使用fluent-nhibernate和传统的hbm.xml

到目前为止,我使用此代码配置会话工厂: Configuration configuration = new Configuration(); configuration.Configure(); SessionFactory = configuration.BuildSessionFactory(); 现在我添加了一些fluentNhibernate映射类,并使用此代码配置: Configuration configuration = new Configuration(); configuration.Configure(); SessionFactory = configuration.BuildSessionFactory(); SessionFactory = Fluently.Configure(configuration).Mappings(m => { m.FluentMappings.AddFromAssemblyOf(); m.FluentMappings.AddFromAssemblyOf(); m.FluentMappings.AddFromAssemblyOf(); }).BuildSessionFactory(); 但我猜它覆盖了旧的xml映射? 现在我想添加到已经存在的 exmbeded资源基于xml的映射 我该怎么做呢? 我看过这个博客 ,但我不想补充 configuration.AddXmlFile(“Mappings / Insurance.hbm.xml”); 或configuration.AddAssembly(…); 对于每个现有的xml(到目前为止,我不为每个ebmbeded资源xml做这个)

从ClassMap 中查找主键

使用Fluent NHibernate ,我有一个任意的ClassMap ,我希望能够找出哪个属性(如果有的话)被设置primary key 。 例: public class PersonMap : ClassMap { public PersonMap() { Id(p => p.StupidPrimaryKeyId).GeneratedBy.Identity().Column(“StupidPrimaryKeyId”); } } … //usage MemberInfo primaryKeyMember = FindPrimaryKey(new PersonMap()); 任何人都可以告诉我FindPrimaryKey的方法体必须是什么才能返回StupidPrimaryKeyId ? 编辑:1/10/12 我原本想要这个,因为我想知道数据库中是否存在一个独立的实体,仅仅基于主键(因此我需要知道主键成员,而不是字符串)。 我设置了这条路径,因为我们的代码库中已经存在很多这样的代码。 在重新思考问题后,我反而意识到映射应该已经处理好了,所以使用NHibernate.Linq我知道这个: public virtual bool RecordExists(TRecord obj) { var exists = _session.Query().Where(r => r == obj).Any(); return exists == false; }

NHibernate Prevent Lazy加载无与伦比的引用

我对NHibernate有一个很大的问题。 我有一个从Table1到Table2的引用,我希望NHibernate在表2中找不到相应的记录时,不要对Table2发出一个SELECT语句,我不知道,真的确实它确实不在那里。 我尝试将修饰符如.LazyLoad(Laziness.False)和.NotFound.Ignore()到我的引用中,但NHibernate在极端偏见中忽略了我的命令,发出了select并破坏了我的代码。

NHibernate – 如何解决SQL Server中的参数计数限制

我有一个网站,以简单的表格forms显示SQL Server的数据,包括filter,排序,页面导航等。我使用Fluent NHibernate作为ORM,查询代码如下所示: public IList GetResults(UserCommand command) { var result = Session.Query(); if (command.Ids != null) result = result.WhereRestrictionOn(o => o.Id).IsIn(command.Ids); // … other filters … return result.Skip(command.Page * command.PageSize).Take(command.PageSize).List(); } 问题是command.Ids (和一些其他输入参数)可能包含很多值。 如果数量超过2100,则查询执行失败,并显示以下错误 System.Data.SqlClient.SqlException: The incoming request has too many parameters. The server supports a maximum of 2100 parameters. Reduce the number of parameters […]

NHibernate:仅加载基类对象

欢迎任何forms的帮助。 即使您可以说(根据您的经验),使用ORM进行如此庞大的层次结构也是疯狂的:)。 Backgroud我的模型层有一个非常庞大的类层次结构,即大约有200个类。 层次结构的好/坏是它们都具有相同的基类。 基类和叶类之间的最大距离是7,层次结构中任何级别的最大数量类是80.我使用nHibernate来保存/加载来自持久存储的数据。 问题 nHibernate生成的查询非常有效。 例如,如果我想基于对基类中的属性的某些filter来选择对象的id,NHibernate将尝试连接层次结构中的所有表/联合它们,这取决于我选择哪种映射策略,即每个子类的表或每个类的表层次结构。 我知道nHibernate没有哪种类型的对象,直到它可以扫描所有相关的表。 但是如果我现在只对基类数据感兴趣呢? 如何强制nHibernate只加载基类对象。 为了说明我的问题,这是一个简化版本 public class Vehicle { public virtual Guid Identifier { get; set; } public virtual int WheelsCount { get; set; } public virtual Make Make { get; set; } public virtual Model Model { get; set; } } public class Bike : Vehicle { […]

具有该表的复合键/外键的映射表

我试图映射一个具有复合键的表,并映射另一个引用该表的表。 假设这些表: 带有相关列的ITEMDELIVERY : ITEMDELIVERY_ID DELIVERY_DATE ITEMDELIVERYDETAIL及相关列: ITEMDELIVERYDETAIL_ID ITEMDELIVERY_ID PARTITIONDATE 列ITEMDELIVERY.ITEMDELIVERY_ID和ITEMDELIVERY.DELIVERY_DATE一起构成PK。 列ITEMDELIVERYDETAIL.ITEMDELIVERY_ID和ITEMDELIVERYDETAIL.PARTITIONDATE形成从ITEMDELIVERYDETAIL到ITEMDELIVERY的FK。 我该如何映射? 我尝试了以下方法: IAutoMappingOverride : mapping.References(x => x.ItemDelivery) .Columns(“ITEMDELIVERY_ID”, “PARTITIONDATE”); IAutoMappingOverride : mapping.CompositeId().KeyProperty(x => x.Id, “ITEMDELIVERY_ID”) .KeyProperty(x => x.DeliveryDate, “DELIVERY_DATE”); 但是这不起作用,导致System.InvalidCastException: Invalid cast from ‘DateTime’ to ‘Double’. 在会话上调用SaveOrUpdate时。 更新: 我刚刚检查了生成的SQL,它显示NHibernate以某种方式切换值: INSERT INTO ITEMDELIVERYDETAIL (ITEMDELIVERYDETAIL_ID, AMOUNT, PROCESSED_BY_REM, SINGLE_ITEM_PRICE, ITEMDELIVERY_ID, PARTITIONDATE, SupplierInvoice_id) VALUES (hibernate_sequence.nextval, :p0, :p1, […]

Nhibernate / Linq:NHibernate.QueryException:无法解析属性:Profile.class:MyNamespace.MyObject

我的linq查询有问题。 我试图根据选定的值过滤对象。 我们使用一个查询模型,它返回一个System.Linq.Expressions.Expression并使用它来创建一个nhibernate查询。 这是我的linq表达。 x =>(request.InitialLoad || (!request.InitialLoad && (Enum.GetValues(typeof(MyType)).Length == request.MyTypes.Length || (Enum.GetValues(typeof(MyType)).Length != request.MyTypes.Length && ((request.MyTypes.Contains((int)MyType.Referrals) && x.Post.PostType == StatusPostType.Referral) || (request.MyTypes.Contains((int)MyType.Businesses) && x.Post.Profile is BusinessProfile) || (request.MyTypes.Contains((int)MyType.Members) && x.Post.Profile is UserProfile) ) ) ) ) ) && x.Profile.Equals(request.Profile); 映射(我们使用流利)看起来像这样: MyObject(Post属性): References(x => x.Post, “PostId”); MyObject.Post(Profile属性): References(x => x.Profile, “ProfileId”); 当我将x.Post.Profile is SomeType更改x.Post.Profile […]