У меня есть следующий (упрощенный) юридическое лицо, которое мне нужно насыпной-вставки:Как вставить объект с набором значений, используя сеанс без состояния?
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: Нет стойкая бактерия для: Метки
Итак, как я могу вставить закладку сущность и его набор тегов?
Это невозможно. И сэкономить некоторое время на сеансе без гражданства. Не уверен, что это может быть достигнуто. В случае, если вы не храните столько данных в одном запросе. Я бы использовал стандартный сеанс. И если вам действительно нужна оптимизация ... вам нужно сделать больше вручную (CreateSQLStatement ...) –