Используете облегченную версию Entity в nHibernate Relations? - PullRequest
5 голосов
/ 12 марта 2010

Является ли хорошей идеей создать в некоторых случаях более легкую версию сущности только из соображений производительности, указывающих на ту же таблицу, но с меньшим количеством сопоставленных столбцов. Например, если у меня есть таблица контактов, которая имеет 50 столбцов, и в нескольких связанных объектах меня может заинтересовать свойство FirstName и LastName, это хорошая идея для создания облегченной версии таблицы контактов. Э.Г.

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

}

Также возможно ли сопоставить несколько классов одной и той же таблице?

Ответы [ 3 ]

5 голосов
/ 12 марта 2010

Не отображать несколько классов в одну таблицу. Я попробовал это однажды, и хотя это сработало для того, что я делал, я уверен, что это укусило бы меня позже. Лучше использовать проекции для заполнения «легких» классов.

4 голосов
/ 13 марта 2010

Это не очень хорошая идея. Вместо этого всегда отображайте полный класс и создавайте меньшие, на которые вы можете проецировать, используя 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 вы также можете использовать анонимный тип для выбора любой проекции по вашему желанию без создания дополнительных типов или отображений.

1 голос
/ 14 марта 2010

Я использовал этот подход для обработки сущности без BLOB-поля (только для обработки отношений и т. Д.).

У меня были некоторые проблемы, связанные с неявным полиморфизмом, что означает, что у меня была эта настройка:

открытый класс ImageWithData: Image

Наследование заставило NHibernate загружать ImageWithData во втором цикле туда и обратно каждый раз, когда я разрешал Image напрямую (не в связи с BelongsTo или HasMany).

В NHibernate есть возможность отключить это поведение, называемое полиморфизмом = "явный", который вы указываете для своего базового класса (в моем случае, Image).

Если это будет плохой дизайн в вашем случае, я не знаю, все зависит от того, почему вам нужно осветить свои сущности.

...