Действительно ли это - хорошая идея создать более легкую версию Объекта в некоторых случаях только по причине производительности, указывающей на ту же таблицу, но с меньшим количеством отображенных столбцов. Например, Если у меня есть Таблица Контакта, которая имеет 50 столбцов, и в немногих связанных объектах я мог бы интересоваться свойством FirstName и LastName, это хорошая идея создать легкую версию таблицы Contact. Например.
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();
Это позволит выбрать из БД только эти три поля, даже при фильтрации по другому полю.
Стоит отметить, что с помощью LINQ вы также можете использовать анонимный тип для выбора любой проекции без создания дополнительных типов или связок.
Я использовал этот подход для обработки сущности без BLOB-поля (только для обработки отношений и т. Д.).
У меня были некоторые проблемы с неявным полиморфизмом, то есть у меня была такая настройка:
открытый класс ImageWithData: Image
Наследование заставляло NHibernate загружать ImageWithData во втором цикле каждый раз, когда я разрешал изображение напрямую (не когда это было связано с помощью BelongsTo или HasMany).
В NHibernate есть опция для отключения этого поведения, называемая polymorphism = "explicit", которую вы указываете в своем базовом классе (в моем случае, Image).
Если это будет плохой дизайн в вашем случае, я не знаю, все зависит от того, зачем вам нужно осветлять свои сущности.
Не сопоставляйте несколько классов в одной таблице. Я попробовал это однажды, и хотя это сработало для того, что я делал, я уверен, что потом это бы меня подкосило. Лучше использовать проекции для заполнения "легких" классов.