Tag: nhibernate

尝试实现策略模式时的WrongClassException(区分自己的Id)

我正在尝试使用Fluent Nhibernate实现策略模式,受此博客文章的启发 public abstract class Strategy { protected Strategy() { } protected Strategy(Guid id) { this.Id = id; } public virtual Guid Id { get; set; } public abstract void SomeMethod(); } public class MyStrategy : Strategy { public MyStrategy() : base(new Guid(“F1CF041B …”)) { } public override void SomeMethod() { } } public class […]

NHibernate 3.2 By Code(Conformist)ClassMapping For Dictionary Property

假设我有一个“SomeClass”类,它有一个查找字典:DataDictionary; 我目前在SomeClass.hbm.xml中有一个映射,如下所示: 我想使用NHibernate的新版本(版本3.2)按代码映射。 我如何映射上面的字典属性? 目前我有: public class SomeClassMap :ClassMap { public SomeClassMap() { Id(x => x.ID, mapping => mapping.Generator(Generators.Guid)); Map(x = x.DictionaryProperty, mapping => { mapping.Key(k => k.Column(“SomeClassID”)); mapping.Table(“SomeClassData”); }); } } 大多数情况下,我不知道如何指定索引的等价物和字典映射的元素。

NHibernate映射:将层次结构保存到单个表而不带鉴别器

我有一个非常可扩展的模块化应用程序。 我想从其他程序集扩展映射的Entites。 但是,我仍然需要对基类进行操作。 例: 程序集A中的父类映射: public class PersonMap : ClassMap { public PersonMap() { Table(“Persons”); Id(x => x.Id).GeneratedBy.Assigned(); } } 程序集B中的子类映射: public class EmployeeMap : SubclassMap { public EmployeeMap() { Table(“Persons”); Extends(typeof(Person)); KeyColumn(“Id”); LazyLoad(); HasMany(x => x.Assignments).KeyColumn(“Id”).Inverse().Cascade.AllDeleteOrphan().LazyLoad().NotFound.Ignore(); } } 现在每当我在Assembly A的某些代码中创建Person时,它就会被NHibernate保存为Employee。 每当我保存一个Person并尝试在Assembly A中刷新它时,由于代理会导致类转换exception。程序集A必须不依赖于程序集B. 我需要在程序集A的所有方法中对父类进行操作。子类仅用于其他程序集。 我该如何映射这样的东西? 我如何告诉NHibernate将它保存为父类? 我使用SaveOrUpdate来保存实体; 如何正确扩展实体,然后将它们保存到没有鉴别器的同一个表中? NHibernate不能按对象类型区分吗? 有解决方法吗? 我不想指定手动代理,因为我必须为每个实体创建代理! 由于依赖性问题,我无法使用访问者模式。 我需要一种方法来扩展不同程序集中的映射实体,而不会出现这样的问题! 数据库是遗留的,我无法改变它。 你会如何解决这个问题?

NHibernate GroupBy和Sum

我正在开始研究NHibernate,我有一个问题我无法解决,我想知道是否有人可以帮助我。 映射正在“正确”工作但是当我尝试进行分组和求和时,应用程序返回以下错误: “无法解析属性:Course.Price of:Persistence.POCO.RequestDetail” var criteria = session.CreateCriteria(typeof(RequestDetail)) .SetProjection( Projections.ProjectionList() .Add(Projections.RowCount(), “RowCount”) .Add(Projections.Sum(“Course.Price”), “Price”) .Add(Projections.GroupProperty(“Request”), “RequestId”) ) .AddOrder(Order.Asc(“RequestId”)) .SetResultTransformer(Transformers.AliasToEntityMap) .List(); 注1:当我接受代码.Add(Projections.Sum (“Course.Price”), “Price”) ,应用程序会正确地返回结果。 注2:我唯一能做的就是运行下面的代码: query.Length = 0; query.AppendLine(“select”); query.AppendLine(” s.Id,”); query.AppendLine(” s.Identification,”); query.AppendLine(” sum(c.Price) as Total”); query.AppendLine(“from”); query.AppendLine(” Student s”); query.AppendLine(“inner join”); query.AppendLine(” Request r on r.StudentId = s.Id”); query.AppendLine(“inner join “); query.AppendLine(” Requestdetail […]

HasManyToMany Fluent NHibernate映射删除错误

我一直在研究一个名为Task的实体上的多对多映射。 任务可以有很多孩子和许多父母。 在它们之间有一个连接表,它只有两个FK列“ParentTaskId”和“ChildTaskId”。 这是我到目前为止所提出的。 // Many-to-Many Parents HasManyToMany(x => x.Parents) .Table(“TaskDependency”) .ParentKeyColumn(“ParentTaskId”) .ChildKeyColumn(“ChildTaskId”) .Inverse() .Not.LazyLoad() .Cascade.SaveUpdate(); // Many-to-Many Children HasManyToMany(x => x.Children) .Table(“TaskDependency”) .ParentKeyColumn(“ChildTaskId”) .ChildKeyColumn(“ParentTaskId”) .Not.LazyLoad() .Cascade.SaveUpdate(); 这里有一些示例代码可以帮助我说明我的问题。 以下代码有效: _taskRepository.Save(_taskVendor); _taskRepository.Save(_taskClientVendor); _taskRepository.Save(_taskClient); _taskVendor.Children.Add(_taskClientVendor); _taskClientVendor.Children.Add(_taskClient); _taskRepository.Save(_taskVendor); _taskRepository.Save(_taskClientVendor); _taskRepository.Delete(_taskVendor); _taskRepository.Delete(_taskClientVendor); _taskRepository.Delete(_taskClient); 但是,如果我将删除语句的顺序更改为: _taskRepository.Delete(_taskVendor); _taskRepository.Delete(_taskClient); _taskRepository.Delete(_taskClientVendor); 我的多对多联接表中出现了fk约束违规。 我认为这与我在映射上设置逆向的方式有关。 它会影响执行查询的顺序,以避免出现这种精确的fk约束问题。 有没有办法映射这个,以便我可以删除任何一方,子或父,但没有此exception的实体? 我在映射的两边都尝试了反向,但这导致了我的多对多关系没有被保存。 > _ < 任何帮助将非常感激。

NHibernate – 无法执行查询 – 输入字符串的格式不正确

我一直在用这个问题摸不着头脑,我对于什么是错的一无所知。 概述:我在MySQL数据库中有两个表。 两者都正确映射到数据库(我可以加载数据),我可以查询到一个表,但不能查询另一个表。 我已经研究过的解决方案:在表和C#代码之间键入转换问题,映射问题,SQL格式问题。 失败的代码如下: Configuration config = new Configuration(); config.Configure(); ISessionFactory sessionFactory = config.BuildSessionFactory(); var schema = new SchemaUpdate(config); schema.Execute(true, true); results = session.CreateSQLQuery(“SELECT * FROM Stats_Table”) // Exception thrown here .AddEntity(typeof(TestStats)) .List(); class级: public class Stats { public virtual Guid Id { get; set; } public virtual Guid TestId { get; set; } […]

使用方法:使用同一个表中的不同业务逻辑映射(NHibernate)多个类?

我目前正在使用一个棕色数据库,该数据库包含一个表,其中包含3种不同类型的业务数据。 它与SalesOrders和订单线有关。 在旧的应用程序中,我们能够为每个销售订单添加3种类型的订单行:产品,小时费率和文本行。 15年前,这是一个快速而肮脏的解决方案,可以在Delphi中轻松查询以获取一个数据网格中的所有行。 一切 现在我尝试使用NHibernate在C#中构建对象模型。 由于这三种线路类型没有真正的业务逻辑连接,我已经制作了3个没有基类的单独实体。 但是,我想将这3种类型合并到一个列表中,以便我可以订购它们。 我已经考虑过使用inheritence,每个类的表,因为表符合要求(没有具有非空约束的列)。 这不是一个合乎逻辑的步骤,因为每种类型的业务完全不同(只有共同点是userId,description和remarks)。 也许是一个组件? 但是如何将属性映射到3个不同的类而没有基类或除表名之外的任何类型的链接? 我希望你们明白我写的是什么。 我还没有真正的代码,我只是在纸上写了一些关于如何处理这段代码的东西。 谁在这里可以帮助我的路上? 亲切的问候,泰德

NHibernate何时使用延迟加载?

我对延迟加载的理解是它只在需要对象时才加载,我们应该使用它。 请解释一下我们必须使用哪些场景而不使用它? 提前致谢。

Nhibernate n + 1与三元关系。 想要三元组中的中间实体

我对nhibernate n + 1有一个很大的问题,我尝试的似乎没有解决问题。 Nhibernate profiler仍显示n + 1选择命中数据库。 这是我的模特: public class CustomerGroup : CoreObjectBase { public virtual long GroupId { get; set; } public virtual Site Site { get; set; } public virtual IList Customers { get; set; } public virtual string Name { get; set; } public virtual string DisplayName { get; set; } […]

NHibernate的QueryOver语法可以选择SqlFunction的MAX()吗?

我在我的方言子类中注册了一个SQL函数 RegisterFunction(“addseconds”, new SQLFunctionTemplate(NHibernateUtil.Date, “dateadd(second, ?1, ?2)”)); 可以在这样的查询中使用 var q = _session.QueryOver() .Select( Projections.SqlFunction( “addseconds”, NHibernateUtil.Date, Projections.Property(x => x.DurationInSeconds), Projections.Property(x => x.StartTime))); 生成SQL SELECT dateadd(second, this_.DurationInSeconds, this_.StartTime) as y0_ FROM [Event] this_ 但我真正追求的是 SELECT MAX(dateadd(second, this_.DurationInSeconds, this_.StartTime)) as y0_ FROM [Event] this_ 不幸的是,我似乎无法让SelectMax采用Projections.SqlFunction。 可以吗?