2015-10-28 4 views
0

У меня есть следующий (упрощенный) юридическое лицо, которое мне нужно насыпной-вставки:Как вставить объект с набором значений, используя сеанс без состояния?

public class BookmarkEntity 
{ 
    public virtual Guid Id { get; set; } 

    public virtual ISet<string> Tags { get; set; } 
} 

И в Tags свойство конфигурируется (через FluentNHibernate):

public class BookmarkEntityMappingOverride : IAutoMappingOverride<BookmarkEntity> 
{ 
    public void Override(AutoMapping<BookmarkEntity> mapping) 
    { 
     mapping.HasMany(x => x.Tags) 
       .AsSet().Element("Value") 
       .Cascade.Delete() 
       .Not.LazyLoad(); 
    } 
} 

В результате в этих таблицах (используя SQLite):

CREATE TABLE "BookmarkEntity" (
    Id UNIQUEIDENTIFIER not null, 
    primary key (Id) 
) 

CREATE TABLE Tags (
    BookmarkEntity_id UNIQUEIDENTIFIER not null, 
    Value TEXT, 
    constraint FK9061CD2928F7F2F9 foreign key (BookmarkEntity_id) references "BookmarkEntity" 
) 

Я бы хотел использовать сессию без гражданства, чтобы уменьшить потребление памяти и улучшить скорость маленький. Я понимаю, что, поскольку сеансы без гражданства не выполняют каскадирование, я должен сам вставить коллекцию Tags. Я попробовал следующее:

void InsertIntoStatelessSession(BookmarkEntity entity, IStatelessSession statelessSession) 
{ 
    statelessSession.Insert(entity); 
    if (entity.Tags != null) 
    { 
     foreach (string tag in entity.Tags) 
      statelessSession.Insert("Tags", tag); 
    } 
} 

Но это не удается с исключением:

NHibernate.MappingException: Нет стойкая бактерия для: Метки

Итак, как я могу вставить закладку сущность и его набор тегов?

+0

Это невозможно. И сэкономить некоторое время на сеансе без гражданства. Не уверен, что это может быть достигнуто. В случае, если вы не храните столько данных в одном запросе. Я бы использовал стандартный сеанс. И если вам действительно нужна оптимизация ... вам нужно сделать больше вручную (CreateSQLStatement ...) –

ответ

0

Сессии без сохранения не поддерживают каскадирование, поэтому то, что вы пытаетесь сделать, невозможно.

Вы можете удалить отображение на BookmarkEntity, а затем заполнить коллекцию Теги вручную после выполнения ГЭТ, как:

BookmarkEntity bookmark = session.Get<BookmarkEntity>(1); 
bookmark.Tags = session.Query<Tag>().Where(t => t.BookmarkEntityID == bookmark.ID).ToList(); 

Может быть добытчиком «Теги» могли бы сделать это автоматически.

При вставке вам нужно сохранить объект BookmarkEntity, захватить сгенерированный идентификатор (если только вы не решите самостоятельно его обработать), установите внешний ключ в тегах, а затем сохраните теги. Например:

Object id = session.Insert(bookmark); 
List<Tag> tags = new List<Tag>() {new Tag() {BookmarkEntityID = Convert.ToInt32(id), Data= "test123"}}; 
session.Insert(tags); 
Смежные вопросы