Tag: nhibernate

流畅的nhibernate – 具有属性的多对多映射

我有2个主表,它们通过地图表链接如下 User [UserId,Name] Resource [ResourceId,Name] UserResourceMap [UserId,ResourceId,AccessLevel] 具有AccessLevel的Resource和User ClassMap如何作为资源属性? 我的Domain类看起来像这样 public class User { public virtual int UserId { get;protected set; } public virtual string Name { get;set; } } public class Resource { public virtual int ResourceId { get;protected set; } public virtual string Name { get;set; } public virtual string AccessLevel { get;set; […]

NHIbernate OR Criteria Query

我有以下映射类 Trade { ID, AccountFrom, AccountTo } Account {ID, Company} Company {ID} 现在我无法弄清楚选择所有交易的方式 AccountFrom.Company.ID = X OR AccountTo.Company.ID = X 我可以使用以下方法让AND工作: criteria.CreateCriteria(“AccountFrom”).CreateCriteria(“Company”).Add(Restrictions.Eq(“ID”, X); criteria.CreateCriteria(“AccountTo”).CreateCriteria(“Company”).Add(Restrictions.Eq(“ID”, X); 但是我如何将其转换为OR而不是AND。 我之前使用过Disjunction,但我似乎不知道如何添加单独的标准,只是限制。

NHibernate映射与类层次结构,其基类是抽象的,鉴别符不是字符串

以下是域模型类: public abstract class BaseClass { … } public class ChildClass : BaseClass { … } 请注意,父类是抽象的,这使得我在使用流畅的nhibernate进行映射时遇到了一些困难。 我的鉴别器是一个字节(DB中的tinyint)。 因为它不是一个字符串而我无法在基类上设置一个鉴别器值,所以这不起作用(取自BaseClass的映射类): DiscriminateSubClassesOnColumn(“Type”) .SubClass() .IsIdentifiedBy((byte)OperationType.Plan) .MapSubClassColumns(p => { … }) 我得到的错误信息是: 类初始化方法UnitTest1.MyClassInitialize引发exception。 NHibernate.MappingException:NHibernate.MappingException:无法将鉴别器值格式化为实体的SQL字符串BaseClass —> System.FormatException:输入字符串格式不正确.. 以下post似乎解释了会发生什么。 他们给出了一个xml的解决方案,但没有流利的nhibernate: http : //forum.hibernate.org/viewtopic.php? t = 974225 谢谢您的帮助。

NHibernate:一个基类,几个映射

我对NHibernate比较陌生,但是我已经将它用于最后几个程序并且我很喜欢。 我遇到了需要将4-5个数据库中的数据聚合到一个数据库中的情况。 具体来说,它是序列号数据。 每个数据库都有自己的映射文件,但最终实体都共享相同的基本结构(Serial类)。 我理解NHibernate希望每个类都有一个映射,所以我最初的想法是拥有一个基本的Serial Class,然后为每个不同的数据库inheritance它,并创建一个唯一的映射文件(inheritance的类将没有内容)。 这应该非常适合抓取所有数据并填充对象。 我想要做的是使用基类映射将这些inheritance的类(不确定正确的术语是什么)保存到基类表中。 问题是我不知道如何强制NHIbernate为对象使用特定的映射文件。 使用’session.save()’时,将inheritance的类转换为基类没有任何作用(它抱怨没有映射)。 有没有办法明确指定使用哪个映射? 或者是否只有一些OOP主体我缺少更具体地将inheritance的类转换为基类? 或者这个想法是不好的。 关于NHibernate(第8章)我可以找到的所有inheritance内容似乎都不完全适用于这个函数,但我可能是错的(每个具体类的表看起来可能有用,但我可以’关于NHibernate如何计算出去做的事情,我完全绕过它。

使用AutoMapper将IList 映射到(Iesi.Collections.Generic)ISet

我一直试图解决这个问题一天,没有在哪里,所以我希望有人可能已经解决了这个问题。 我发现最接近解决方案的是如何使用AutoMapper简单地将NHibernate ISet映射到IList并通过AutoMapper 将IList 映射到ICollection但仍然没有乐趣。 我有一个数据对象,看起来像: public class Parent { public virtual ISet Children {get; set; } } 以及如下所示的业务对象: public class ParentDto { public IList Children {get; set; } } 使用AutoMapper从数据映射到业务工作正常: … Mapper.CreateMap(); Mapper.CreateMap(); … ParentDto destination = CWMapper.Map(source); 但是,当我从业务映射到数据时,我得到错误: … Mapper.CreateMap(); Mapper.CreateMap(); … Parent destination = CWMapper.Map(source); 无法将’System.Collections.Generic.List’类型的对象强制转换为”Iesi.Collections.Generic.ISet’ 我添加了一个自定义映射: Mapper.CreateMap() .ForMember(m => m.Children, o […]

DI / IoC,NHibernate并帮助他们一起工作

我正试图了解DI / IoC,NHibernate并让它们在我正在开发的应用程序中很好地协同工作。 我对NHibernate和DI / IoC都很陌生,所以不太确定我所做的是否是合理的方式。 这是场景: 该应用程序为用户提供了计算特定金融交易的特定值(称为保证金)的能力。 每个事务的marging值的计算是通过抽象MarginCalculator类的具体实现来执行的,并且要使用的具体实现取决于特定事务的产品类型(由产品对象的某个字段给出)。 通过产品类上的属性访问具体的计算器类。 即 public class Transaction { private double _margin; private Product _product; private Client _client; public double Margin { get; } public Product Product { get; } public Client Client { get; } public Transaction(Product p, Client c) { _product = p; _client = c; } […]

NHibernate中有任何算术运算预测吗?

我想从NHibernate获取这个SQL: SELECT SUM(color_pages) * SUM(total_pages) FROM connector_log_entry GROUP BY department_name 但我无法在任何地方找到任何算术运算(*)投影。 这是我到目前为止的代码: Session.QueryOver() .SelectList(list => list .SelectGroup(m => m.DepartmentName) .WithAlias(() => dto.Department) .Select(Projections.Sum(m => m.TotalPages)) //.Select(Projections.Sum(m => m.ColorPages)) .WithAlias(() => dto.TotalColorPercentage)) .TransformUsing(Transformers.AliasToBean());

NHibernate Query 与QueryOver 有什么区别?

我刚开始使用NHibernate(使用SQLite)在我当前的项目中,我主要使用Query ,因为我很熟悉在Linq中编写数据库查询。 当我遇到一些更复杂的查询时,我对QueryOver进行了一些研究,并认为它应该优于Query因为“QueryOver语法是NH特定的” 。 此外, Query似乎没有任何QueryOver无法完成的操作。 所以我开始相应地更换Query所有用法。 不久之后,我遇到第一个“问题”,使用Query似乎更方便。 示例(从表BillingDataEntity CustomNumber列中选择最高值): int result = Session.Query().Select(x => x.CustomNumber).OrderByDescending(a => a).FirstOrDefault(); int result = Session.QueryOver().Select(x => x.CustomNumber).OrderBy(a => a.CustomNumber).Desc.Take(1).SingleOrDefault(); 我不喜欢的是需要将结果显式地转换为int,并且Query 版本更容易阅读。 我的查询完全错了,换句话说:有没有更好的方法呢? 我看了一下生成的SQL输出: NHibernate: select billingdat0_.CustomNumber as col_0_0_ from “BillingDataEntity” billingdat0_ order by billingdat0_.CustomNumber desc limit 1 NHibernate: SELECT this_.CustomNumber as y0_ FROM “BillingDataEntity” this_ ORDER BY this_.CustomNumber […]

NHibernate3查询与QueryOver

我注意到有两种方法可以创建对nhibernate的友好通用友好访问。 IQueryOver query= session.QueryOver().Where(criteria); 和 IQueryable query= session.Query().Where(criteria); 每个接口的实现。 IQueryOver : IQueryOver, IQueryOver 和 IQueryable : IEnumerable, IQueryable, IEnumerable IQueryable实现IEnumerable,因此支持您期望的所有LINQ友好的东西。 我正在倾向于这个实现,但是想知道是否有人知道QueryOver的目的是什么,你无法用Query完成?

使用NHibernate对延迟加载的集合进行分页

我读过这篇文章 ,其中Ayende表示NHibernate可以(与EF 4相比): 使用lazy =“extra”的集合 – Lazy extra意味着NHibernate适应您可能在集合之上运行的操作。 这意味着blog.Posts.Count不会强制加载整个集合,而是会从Posts中创建一个“select count(*),其中BlogId = 1”语句,而blog.Posts.Contains()同样会产生在单个查询中,而不是支付将整个集合加载到内存的价格。 集合filter和分页集合 – 这允许您在实体集合之上定义其他filter(包括分页!),这意味着您可以轻松浏览blog.Posts集合,而不必将整个内容加载到内存中。 所以我决定整理一个测试案例。 我创建了陈词滥调的Blog模型作为一个简单的演示,有两个类如下: public class Blog { public virtual int Id { get; private set; } public virtual string Name { get; set; } public virtual ICollection Posts { get; private set; } public virtual void AddPost(Post item) { if (Posts […]