2010-10-11 5 views
1

У меня есть таблица регистрации веб-страниц хитов. Что-то вроде: {VisitId, VisitorId, Url, Date} (Идентификатор посетителя - это GUID, хранящийся в файле cookie)NHibernate создать объект только из коллекции детей

Я хотел бы создать объект посетителя, который имеет коллекцию объектов Visit.

class Visitor { 
    public virtual Guid VisitorId { get; set; } 
    public virtual IList<Visit> Visits { get; set; } 
} 

Вместо того, чтобы добавить еще одну таблицу для посетителей, может NHibernate создать этот объект только из коллекции Визитов? В идеале, я хотел бы написать:

var visitor = session.Get<Visitor>(guidFromCookie) 

И затем иметь возможность работать со списком Визиты и сохраняются изменения обратно в БД.

(я использую FluentNHibernate и NHibernate 3,0)

Я новичок в NHibernate, но мне кажется, что-то должно быть возможно с помощью пользовательского IEntityPersister, или это слишком низкий уровень и нагрузок работы? Мы ценим любые предложения.

ответ

0

Когда вы говорите «создайте этот объект», вы хотите получить? В чем причина отсутствия таблицы посетителя? Вы можете использовать criteria API или hbm для загрузки списка посещений директором, если вы не хотите, чтобы объект/таблица посетителя.

+0

Да, я хочу к извлечения объекта из ISession. –

+0

У меня нет таблицы посетителей, потому что мне это не нужно. У него будет только один столбец идентификатора. –

+0

Думаю, вам понадобится таблица, если вы хотите использовать «Get». В противном случае вам придется использовать какой-то способ запроса таблицы посещения, которая не использует первичный ключ (т. Е. CreateCriteria, hql и т. Д.), –

0

Если вы сопоставили Visitor и сделали это Lazy Loaded, возможно, вы сможете это сделать. Вы должны сказать NHibernate, что таблица существует, хотя это не так. Однако, если вы хотите получить объект Visitor (обратите внимание, что единственным отображаемым свойством является Id), то вместо использования .Get() используйте .Load(), который вернет неинициализированный прокси. Таким образом, у вас будет сущность, но она фактически не попадет в базу данных, поэтому она никогда не узнает, что таблица не существует.

public class VisitorMap : ClassMap<Visitor> 
{ 
    public VisitorMap() 
    { 
     Table("SomeNonExistentTable"); 
     LazyLoad(); // should be the default anyway 
     Id(x => x.Id) 
      .GeneratedBy.Guid(); 
     HasMany(x => x.Visits) 
      .AsList() 
      .Not.LazyLoad(); 
    } 
} 

... а потом ...

var visitor = session.Load<Visitor>(guidFromCookie); 
foreach(var visit in visitor.Visits) 
{ 
    // do wonderful things 
} 
Смежные вопросы