如何使用无状态会话插入具有值集合的实体?

时间:2015-10-28 13:12:43

标签: c# sqlite nhibernate fluent-nhibernate stateless-session

我有以下(简化)实体,我需要批量插入:

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:没有持久性:标签

那么,我如何插入书签实体及其标签集?

1 个答案:

答案 0 :(得分:0)

无状态会话不支持级联,因此您尝试做的事情是不可能的。

您可以删除BookmarkEntity上的映射,然后在执行get后手动填充Tags集合,例如:

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

也许“标签”的吸气器可以自动完成。

插入时,您需要保存BookmarkEntity,获取生成的ID(除非您决定自己处理),在标签上设置外键,然后保存标签。例如:

Object id = session.Insert(bookmark);
List<Tag> tags = new List<Tag>() {new Tag() {BookmarkEntityID = Convert.ToInt32(id), Data= "test123"}};
session.Insert(tags);