Performance 在nHibernate关系中使用实体的Lite版本?

Performance 在nHibernate关系中使用实体的Lite版本?,performance,nhibernate,hibernate,castle-activerecord,Performance,Nhibernate,Hibernate,Castle Activerecord,在某些情况下,仅仅出于性能原因,创建实体的较轻版本是一个好主意,它指向同一个表,但映射的列较少。例如,如果我有一个联系人表,它有50列,在一些相关的实体中,我可能对FirstName和LastName属性感兴趣,那么创建一个轻量级的联系人表是一个好主意。例如 public class ContactLite { public int Id {get; set;} public string FirstName {get; set;} public string LastName

在某些情况下,仅仅出于性能原因,创建实体的较轻版本是一个好主意,它指向同一个表,但映射的列较少。例如,如果我有一个联系人表,它有50列,在一些相关的实体中,我可能对FirstName和LastName属性感兴趣,那么创建一个轻量级的联系人表是一个好主意。例如

public class ContactLite
{
   public int Id {get; set;}
   public string FirstName {get; set;}
   public string LastName {get; set;}

}

也可以将多个类映射到同一个表吗?

不要将多个类映射到同一个表。我试过一次,虽然它对我正在做的事情有效,但我相信它会在以后咬我。最好使用投影来填充“灯光”类。

这不是一个好主意。相反,始终映射整个类并创建较小的类,您可以使用
Transformers.AliasToBean
或LINQ对其进行投影

后者的一个例子是:

var lightContacts = (from contact in session.Linq<Contact>()
                     where contact.Country = "Argentina"
                     select new LightContact
                            {
                                Id = contact.Id
                                FirstName = contact.FirstName,
                                LastName = contact.LastName
                            })
                    .ToList();
var lightContacts=(来自session.Linq()中的联系人)
where contact.Country=“阿根廷”
选择新的LightContact
{
Id=contact.Id
FirstName=contact.FirstName,
LastName=contact.LastName
})
.ToList();
这将仅从数据库中选择这三个字段,即使按不同的字段进行过滤也是如此


值得注意的是,使用LINQ,您还可以使用匿名类型来选择您想要的任何投影,而无需创建其他类型或映射。

我使用这种方法来处理没有BLOB字段的实体(仅用于处理关系等)

我有一些关于隐式多态性的问题,这意味着我有以下设置:

公共类ImageWithData:Image

继承使NHibernate在每次我直接解析图像时(不是与BelongsTo或HasMany相关时)在第二次往返中加载带有数据的图像

NHibernate中有一个选项可以禁用这种行为,称为polymorphics=“explicit”,您可以在基类(在我的例子中是Image)上指定它


我不知道,在你的情况下,这是否会是一个糟糕的设计,这完全取决于你为什么需要减轻你的实体

我想主要用于关系。如果我有一个多-2-1关系,那么我不希望它加载50列。仍然是相同的情况。默认情况下,多对一使用主键作为代理加载,如果您像上面那样排除它们,则根本不会加载它们。不幸的是,我使用的是带有WCF的nHibernate 1.2,延迟加载不是我的选项。因此,所有内容都是急切获取的。1.2已经过时,目前完全不受支持。你应该真的,真的考虑升级。而且,WCF不应该和这个决定有任何关系;如果是这样,则说明您在错误的层上工作。