Tag: nhibernate

使用Fluent NHibernate进行映射时对接口进行编程

我已经被提交并已经开始学习Fluent NHibernate(没有以前的NHibernate经验)。 在我的项目中,我正在编程接口以减少耦合等。这意味着几乎所有“一切”都指的是接口而不是具体类型(IMessage而不是Message)。 这背后的想法是通过能够模拟依赖关系来帮助使其更易于测试。 但是,(流畅)当我尝试映射到接口而不是具体类时,NHibernate不喜欢它。 问题很简单 – 根据Fluent Wiki,例如,定义我的类的ID字段是明智的 int Id { get; private set; } 获取典型的自动生成的主键。 但是,这只适用于具体的类 – 我不能在接口上指定访问级别,同一行必须是这样 int Id { get; set; } 而且我认为否定在具体类中将setter设为私有(这个想法是只有NHibernate应该将ID设置为由DB分配)。 就目前而言,我想我只会公开制定者,并试图避免写入它的诱惑。但是,是否有人知道什么是“适当的”,最佳实践方式来创建一个正确的主键只有NHibernate可以写入的字段,同时仍然只编程到接口? 更新 根据我在mookid和James Gregory的两个答案后的理解,我可能会走错路 – 我不应该有理由让每个实体拥有一个接口,就像我现在一样。 这一切都很好。 我想我的问题就变成了 – 是否没有理由对任何实体的接口进行100%编程? 如果甚至有一种情况可以certificate这是合理的,那么可以用(流利的)NHibernate做到这一点吗? 我问,因为我不知道,不要批评。 谢谢你的回复。 🙂

多态性:ORM实体是域实体还是数据实体?

我有一个BankAccount表。 LINQ to SQL生成一个名为“BankAccount”的类,如下所示。 [global::System.Data.Linq.Mapping.TableAttribute(Name=”dbo.BankAccount”)] public partial class BankAccount : INotifyPropertyChanging, INotifyPropertyChanged 现在,作为一个新手,我自己新创建域对象。 请参阅IBankAccount接口和FixedBankAccount类。 关键点在于存在多态行为–IBankAccount可以是FixedBankAccount或SavingsBankAccount。 对于这个例子的另一个问题,我有以下两条评论。 @mouters:“你的存储库对象和域对象很奇怪 – 你的存储库是不是只返回域对象?” @SonOfPirate:“存储库应该使用工厂来根据从数据存储中检索的数据创建实例。” 质询 1)我手动创建域实体。 这是错误的方法吗? 如果是错的,LINQ to SQL类如何处理多态? 如何将方法添加到这些类? 2)存储库应如何使用工厂根据从数据存储中检索的数据创建实例? 任何代码示例或参考? 3)它是否满足单一责任原则? 码 public interface IBankAccount { int BankAccountID { get; set; } double Balance { get; set; } string AccountStatus { get; set; } void FreezeAccount(); […]

如何在nHibernate中部分地投影具有许多字段的子对象

我有以下nHibernate查询,它根据其课程ID 选择课程,然后在初始提取时返回课程对象的选定字段 ,并且查询执行时没有任何问题。 MatchMode option = … CourseItem courseAlias = null; TeacherItem teacherAlias = null; var query = session.QueryOver() .JoinAlias(c => c.Teacher, () => teacherAlias) .Where(c => c.CourseID.IsInsensitiveLike(strNumber, option)) .SelectList(list => list .Select(c => c.CourseID).WithAlias(() => courseAlias.CourseID) .Select(c => c.IsActive).WithAlias(() => courseAlias.IsActive) .Select(c => c.CourseDesc).WithAlias(() => courseAlias.CourseDesc) .Select(c => c.Teacher).WithAlias(() => courseAlias.Teacher)) .TransformUsing(Transformers.AliasToBean()) .List(); 我想进一步查询只返回部分教师对象,假设我只想返回ID和名称。 […]

如何创建NHibernate HasManyToMany关系

我知道有关于HasManyToMany的问题,但这次我想把几个字段放到中间表中,如’Description,CreationDate’。 对于我的情况,我不想双向绑定。 我有公司,人员和地址表。 每个公司或个人可能有超过1个地址。 在这种情况下我该怎么办? 我应该如何编写类和映射的代码? 您可以在下面看到表格:

NHibernate如何查询IList 属性?

我试图使用NHibernate查询我的一个域类上的IList 属性。 这是一个简单的例子来演示: public class Demo { public Demo() { this.Tags = new List(); } public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual IList Tags { get; set; } } 映射如下: 我能够保存和检索就好了。 现在查询我的域类的实例,其中Tags属性包含指定的值: var demos = this.session.CreateCriteria() .CreateAlias(“Tags”, “t”) .Add(Restrictions.Eq(“t”, “a”)) .List(); 导致错误:集合不是关联:Demo.Tags var demos […]

在使用Oracle时,如何使用Fluent NHibernate实现批量提取?

我尝试过使用Futurefunction和Oracle,但NHibernate不支持它。 我已经阅读了一些关于Batch Fetchingfunction的内容: http : //docs.huihoo.com/hibernate/nhibernate-reference-1.2.0/performance.html 我如何在Fluent NHibernate中使用它? 应该如何配置?

NHibernate – 使用Junction / Joiner表进行多对多查询

我在这里发现了非常相似的问题,但没有一个与我正在寻找的完全匹配。 我发现的两个最接近的线程是(是的,它们是不同的线程): NHibernate多对多标准 (1) NHibernate多对多标准 (2) 但是,我认为这两者都使用直接的多对多关系。 我实际上通过与联结表具有两个一对多关系来模拟多对多关系,这是非常标准的做法。 这是我的NHibernate映射: 文件: 属性: 乔伊纳: 所以我的问题与上面的第二个链接完全相同,但是使用了连接表。 所以: 给定一组属性ID,我希望运行一个查询,该查询为我提供了具有所有匹配属性的文件。 我可以轻松地对集合中的每个属性ID运行“n”查询,并比较每个列表中出现的文件ID的每个列表,但我觉得应该有一种更简单的方法可以一次使用一个查询完成所有操作。 例: File | Attributes ———-+—————————————————– foo.txt | (mode = read-only, view = visible) bar.txt | (mode = read-write, security = all, view = visible) duck.txt | (mode = read-only, view = hidden) goose.txt | (more = read-only, security = […]

查询HasMany引用

我有一个像这样的实体模型: public class Request { public virtual IList Responses { get; set; } } public class Response { public virtual DateTime Timestamp { get; set; } public virtual bool Success { get; set; } } 我正在尝试创建一个Query ,它将向我提供所有请求 ,其中最新的响应 (关于其时间戳 )是成功的 。 如何才能做到这一点?

NHibernate AliasToBean转换器关联

我正在尝试使用以下语句来获取具有我所追求的字段的实体: retVal = session.CreateCriteria(typeof(MyEntity)) .CreateAlias(“MyEntityProperty”, “MyEntityProperty”) .Add(Restrictions.Eq(“MyEntityProperty.Year”, year)) .SetProjection( Projections.Distinct( Projections.ProjectionList() .Add(Projections.Property(“Property1”), “Property1”) .Add(Projections.Property(“Property2”), “Property2”) .Add(Projections.Property(“MyEntityProperty.RegisteredUser”), “MyEntityProperty.RegisteredUser”) .Add(Projections.Property(“MyEntityProperty.CompanyInfo”), “MyEntityProperty.CompanyInfo”) ) ) .SetResultTransformer(Transformers.AliasToBean(typeof(MyEntity))) .List() .Cast(); MyEntity是我想要返回的实体,MyEntityProperty是MyEntity的一个属性,它是另一个实体(MyEntityProperty类型)。 我得到的错误是Could not find a setter for property ‘MyEntityProperty.RegisteredUser’ in class ‘MyEntity’ AliasToBean转换器是否无法处理子实体? 或者还有什么我需要做的才能让它发挥作用?

带有额外列的多对多nhibernate

所以我有两个表Users和Groups 。 这些表(在数据库中)与UGlink链接表一起使用。 现在除了主外键之外,链接表还有一个额外的列: Date 。 根据我的理解,这意味着我必须有两个多对一,链接“在中间”。 但是,因为我几乎从不对额外的列值感兴趣,所以无论如何都要避免链接? 那是我希望能写的: thisUser.Groups 获取组,而不是: thisUser.UGlinks.Group