我有以下(简化)实体,我需要批量插入:
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 :(得分: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);