NHibernate是.NET框架的成熟的开源对象关系映射器(ORM)。
我想使用 Criteria Query 来计算 NHibernate 中的模型集。 帐户模型有联系人(组),联系人模型有地址(组)。 我想通过输入 Account obj 来计算地址...
我正在尝试编写一个自定义的 Linq 扩展,它也可以在数据库中执行。 基本上,我想做的是 collectionOfStrings.Where(x => !x.IsNullOrWhiteSpace) 不幸的是......
NHibernate - 创建自定义 Linq 扩展时出现问题
我在NH Linq中有这样的查询: var 查询 = _session .查询() 。加入( _session.Query(), rev => rev.Document, 文档 => 文档, (...
SqlException:不允许启动新请求,因为它应该带有有效的事务描述符
我最近用一个简单的解决方案解决了一个难以捉摸的错误。希望这对某人有帮助。我的环境: ASP.NET 核心 微软SQL服务器 NHibernate 症状相当奇怪。当
如何将 IQueryable 转换为“表达式”<Func" to provide Projection list to NHibernate QueryOver?
请参考以下代码: 使用(ISession会话= SessionFactory.OpenSession()) { //情况 1:使用 Query = 效果很好。 IList listMaster = session.Query 请参考以下代码: using(ISession session = SessionFactory.OpenSession()) { //Case 1: using Query = works fine. IList<MasterDto> listMaster = session.Query<MasterEntity>() .ProjectTo<MasterDto>(autoMapperConfig) .ToList(); //Case 2: using QueryOver = how to achieve same result as above? IQueryable<MasterDto> masterDtos = session.Query<MasterEntity>() .ProjectTo<MasterDto>(autoMapperConfig); IList<MasterEntity> list = session.QueryOver<MasterEntity>() .Select(masterDtos)//This of-course does not work .List(); } 如果我在案例 2 中注释 Select(masterDtos),以上两种情况都会返回相同的结果。其他区别是生成的 SQL 查询。 在上面的情况 1 中,生成的 SQL 仅包含 Dto 中存在的列。它会跳过 Entity 中存在但 Dto 中不存在的附加列。这对于提高 SQL 查询性能是必要的。 传递给 autoMapperConfig 方法的 ProjectTo 参数有 AutoMapper.MapperConfiguration 的实例。 案例 1 工作正常。 但是我有大量使用 QueryOver 的遗留代码。 将此代码从 QueryOver 迁移到 Query NHibernate API 非常困难且容易出错。 所以,我正在考虑如何使用 QueryOver 来实现这一目标(选择选定的列)。 我已经知道的一种方法是使用 Select 和/或 SelectList 的 QueryOver 方法并向其传递适当的参数。 这会工作得很好;但这种方法几乎没有问题: 我必须输入每个投影/表达式作为这些方法的输入。 如果我以后更改 Dto,我应该记得更改投影列表。 所以,我在想上面代码中提到的一些事情。这可能吗?还有其他类似/更简单的解决方案吗? Query和QueryOver是两个不同的东西。他们以不同的方式工作。对于 QueryOver,您必须使用 Select 和/或 SelectList 的 QueryOver 方法,正如您在问题中指出的那样。 对于 Query(返回 IQueryable),ProjectTo 接受类型为 IConfigurationProvider 的参数,您将其作为 autoMapperConfig 提供。因此,你的第一个案例有效。 您的第二种情况完全错误,因为传递给 Select 方法的参数与类型不匹配。 以下代码与您的第一个案例类似并且可以正常工作: var autoMapperConfig = new MapperConfiguration ( cfg => { cfg.CreateProjection<MasterEntity, MasterDto>(); cfg.CreateProjection<DetailEntity, DetailDto>() .ForMember(dto => dto.MasterData, conf => conf.MapFrom(ol => ol.Master.MasterData)); cfg.CreateProjection<DetailEntity, DetailMiniDto>(); } ); using(ISession session = SessionFactory.OpenSession()) { IList<MasterDto> listMaster = session.Query<MasterEntity>() .Where(x => x.MasterId == 1) .ProjectTo<MasterDto>(autoMapperConfig) .ToList(); IList<DetailDto> listDetail = session.Query<DetailEntity>() .Where(x => x.Master.MasterId == 1) .ProjectTo<DetailDto>(autoMapperConfig) .ToList(); } 以下是MasterEntity、MasterDto和MasterMap: public class MasterEntity { public virtual int MasterId { get; set; } public virtual string MasterData { get; set; } public virtual IList<DetailEntity> DetailList { get; set; } } public class MasterDto { public string MasterData { get; set; } public IList<DetailMiniDto> DetailList { get; set; } } internal class MasterMap : ClassMapping<MasterEntity> { public MasterMap() { Table("MasterTable"); Id(x => x.MasterId, im => { im.Column("MasterId"); im.Generator(Generators.Identity); }); Property(x => x.MasterData, map => { map.Type(TypeFactory.GetAnsiStringType(5)); }); Bag ( x => x.DetailList, map => { map.Key(k => k.Column("MasterId")); }, rm => rm.OneToMany() ); } } 以下是DetailEntity、DetailDto、DetailMiniDto和DetailMap: public class DetailEntity { public virtual int DetailId { get; set; } public virtual string DetailData { get; set; } public virtual MasterEntity Master { get; set; } } public class DetailDto : DetailMiniDto { public string MasterData { get; set; } } public class DetailMiniDto { public int DetailId { get; set; } public string DetailData { get; set; } } internal class DetailMap : ClassMapping<DetailEntity> { public DetailMap() { Table("DetailTable"); Id(x => x.DetailId, im => { im.Column("DetailId"); im.Generator(Generators.Identity); }); Property(x => x.DetailData); ManyToOne(x => x.Master, map => { map.Column("MasterId"); map.Cascade(Cascade.None); }); } }
SetFirstResult() 在 nHibernate C# 中第一页崩溃
我有一个用 C# 构建的查询。假设这是查询 - sb 是字符串生成器 - 查询在数据库中工作正常 字符串查询字符串 = @" SELECT * ...
如何将注释放入HQL(Hibernate Query Language)中?
是否可以将注释放入 Hibernate 查询语言中? 如果是的话,怎么办?
当我尝试向表中插入记录时,出现以下错误。 当我对同一个表执行更新和选择操作时,没有任何问题。 Nhibernate Proviler 插入命令:...
我有 NH 查询 结果 = Session.Query() .include(s => s.a) .include(x => x.b) .include(x => x.c); 我有两个过滤结果
环境:NHibernate(3.3.3.4001)、FluentNHibernate(1.4.0.0) 下面是 FluentNHibernate 映射: 公共类 CustomerMap : ClassMap { 公共客户地图() ...
我的 NHibernate 配置与 SQL Server 数据库的连接遇到了一些问题。我的应用程序结构仅用于简单测试。这是我的 hibernate.xml.cfg: 我的 NHibernate 配置与 SQL Server 数据库的连接遇到了一个小问题。我的应用程序结构仅用于简单测试。这是我的hibernate.xml.cfg: <?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration> <session-factory xmlns="urn:nhibernate-configuration-2.2"> <property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property> <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="connection.url">jdbc:jtds:sqlserver://OUSSEMA;DatabaseName=DB_GestionCompte</property> <property name="connection.username">sa</property> <property name="connection.password">123</property> <property name="show_sql">true</property> </session-factory> </hibernate-configuration> 我在运行项目时遇到此错误: System.TypeInitializationException: 'The type initializer for 'HibernateUtil' threw an exception.' HibernateConfigException: An exception occurred parsing configuration :The 'name' attribute is invalid - The value 'connection.url' is invalid according to its datatype 'Union' - The value 'connection.url' is not valid according to any of the memberTypes of the union. 上述错误是在以下代码行中引发的:DataService.cs: ISessionFactory factory = HibernateUtil.GetSessionFactory(); 我尝试了不同的 NHibernate 配置方法,但没有一个有效。同时我确信 SQL 身份验证有效且线路正确。 以下属性名称有效;您需要根据您的配置更改值: <?xml version="1.0"?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> <property name="connection.connection_string">Data Source=SQLServer;Initial Catalog=DBName;User ID=SQLUser;Password=SQLPassword</property> <property name="default_schema">[XYZ].[dbo]</property> <property name="connection.isolation">ReadCommitted</property> <property name="show_sql">false</property> <mapping assembly="MyMappingsAssembly"/> </session-factory> </hibernate-configuration> 但是,您可以选择通过代码来完成所有这些操作,而不是使用 XML 配置。请参阅this答案,其中解释了如何做到这一点。 other 答案解释了如何将 SQL 查询记录到文件中。 查看文档,您的配置似乎使用了无法识别的属性名称。 例如,connection.url,应该是connection.connection_string。我在文档中看不到 connection.username 或 connection.password 的等效项。这些通常包含在连接字符串中。
我正在使用 NHibernate 作为我的 ORM 编写 ASP.NET MVC 应用程序。不过,我在设计上遇到了一些困难,希望得到一些意见。 所以,我的问题是我该把我的业务/验证放在哪里......
我的 Hibernate 配置与 SQL Server 数据库的连接面临一个小问题, 所以我的应用程序结构只是为了简单测试,这里是架构:在此处输入图像描述 所以
当我锁定反序列化的对象时遇到问题。 例如。: var session = sessionFactory.OpenSession(); var item = session.QueryOver().Where(x => x.Id = "1").FutureValue().
我有一个 Oracle 数据库,其中一个字段是日期范围字段。它基本上只是以 YYYY/MM/DD-YYYY/MM/DD 格式作为 VARCHAR(40) 存储在数据库中。我想在 nHibernat 中映射它...
我有一个实体类,用于表示 sql 查询的结果。类的映射如下所示。但据我所知,nhiberate 将映射视为存在真实的数据库
Azure SQL 托管实例和本地 SQL 中的 Nhibernate 错误消息
有人遇到过类似的问题吗?使用 Orchard 多年后,下面的异常突然开始出现。该网站被锁定,并且在
我已经生成了一些流畅的 NHibernate 代码。它的实体代码如下: 私有 ISet _cardPlace; 公共杂志类型() { _cardPlace = 新的哈希集 我已经生成了一些流畅的 NHibernate 代码。它的实体代码如下: private ISet<CardPlace> _cardPlace; public MagazineType() { _cardPlace = new HashedSet<CardPlace>(); } public virtual ISet<CardPlace> CardPlace { get { return _cardPlace; } set { _cardPlace = value; } } 该属性的映射如下: HasMany(x => x.CardPlace) .Access.CamelCaseField(Prefix.Underscore) .Cascade.AllDeleteOrphan() .Fetch.Select() .AsSet() .Inverse() .LazyLoad() .KeyColumns.Add("MAGAZINE_ID"); 我不明白的是.Access.CamelCaseField(Prefix.Underscore)线。为什么它不直接映射到属性而是映射到私有支持字段?这样做有什么理由吗? 如果删除 .Access.CamelCaseField(Prefix.Underscore) 映射将到属性 getter 和 setter。 该行指示流利的 nhiberate 使用该字段。 这里的答案将/应该/可能是:改进领域模型设计。这里的主要辅助词是“封装”。因为: 为什么我们要尝试创建实体模型(包含所有业务/验证规则)... ...同时保持后门打开,即拥有公共设置器。 有一篇非常好的文章,深入探讨了这一点: 加强您的领域:避免设置者 让我引用它的摘要(但请仔细阅读该文本) 聚合根边界在理论上很有趣,但您可能看到的许多领域模型仅具有名义上的边界。 如果域模型公开操作和命令只是为了通过直接转到属性设置器来公开绕过这些操作,那么实际上根本没有边界。 ... 保留公共设置器的理由通常是“更容易测试”。根据经验,无效的域对象更令人困惑并且更难测试,因为您无法知道在使用应用程序时您已经设置了一个实际上有效的上下文。 文章中的所有论点(请阅读)都浓缩在最后一段: 我们可以通过以下方式避免这种混乱和可能的额外防御性编码: 删除只能通过在我们的域模型上执行的操作和命令来更改的数据的公共设置器。 再次强调,这就是封装的意义所在。我们的模型只公开支持的内容,不允许不支持的内容。 注意:嗯,我确实使用公共设置器,并且我确实使用“借口”,例如“这更适合测试...... 映射到支持字段至少有几个原因。 封装,正如 Radim Köhler 在上面提到的“位于核心”。但是,让我帮忙举一些实际例子。 首先拥有一个私有支持字段可以允许在获取值或设置值时完成一些工作。 将 DB 数据映射到支持字段允许 getter 执行读取数据时正在完成的工作,并允许设置数据时完成的工作。但是,支持字段将是存储时的原始数据库数据。 您可能会问什么样的工作?假设您将数据作为标志存储在数据库中......您可以将设置器中的标志转换为某种二进制格式,然后在读取时将其从二进制格式转换回来——允许属性将转换封装为存储在数据库中的原始数据。属性可以使用相同的数据库列,对二进制或整数数据库类型进行逻辑运算。有时,您的数据库可能包含多年的数据并与其他系统集成,这不允许您轻松更改数据库格式。您的 getter/setter 可以将其转换为代码中更容易理解的格式。您甚至可以执行一些编码/解码。有很多可能性。 封装也可能涉及复杂性。 假设数据库中存储的内容涉及许多因素——类中许多事物的一些复杂结果,这些结果是由方法以及其他属性、字段、引用对象等的状态产生的。在这种情况下,您可能无法掌握所有内容设置器中的逻辑。您可能有一个私人二传手或根本没有二传手。读取该值可能仍然通过公共或受保护的 getter 进行,需要进行一些少量的工作。在这种情况下,支持字段必须保存映射。当需要工作时,您不能允许公开设置或获取属性,因为有人很容易认为他们可以直接获取或设置值并绕过转换值所需的工作。如果 setter 或 getter 直接映射到数据库中的原始数据,他们甚至可能会尝试再次重复封装在类中的工作。 在处理集合或复杂类型时,有时您需要在 getter 或 setter 中进行转换。您通过属性公开复杂类型,但数据在数据库中被归结为简单类型。组件映射也可以做到这一点。
nhibernate5.5.0 JoinEntityAlias 多个 ProjectionList 结果不起作用
公共IListGetNonassetJoinPersonData(ExpressionConditionnonassetCondition) { var lambda_contract_effect = bizUTRenterContract.
如何使用“not in”进行 NHibernate QueryOver?
有没有办法让 NHibernate 的查询变得更容易? 为了便于理解,这是我想用 NHibernate 创建的查询: 从任务中选择* 其中task_id不在 (选择task_id...