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

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

4

1 回答 1

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);
于 2015-10-30T14:29:50.520 回答