在NHibernate

时间:2016-04-03 14:24:25

标签: c# sql nhibernate

如果使用INSERT查询添加对象的状态是什么?我怎么能得到这个对象相同的会话?

使用本机SQL插入对象

session.CreateSQLQuery("INSERT INTO table (...) VALUES (...)").ExecuteUpdate())

我知道他的身份,所以用这个来获取:

sessison.Get<MyObjectType>(id)

但对象为null,因为会话相同且提交仍处于挂起状态。 我做错了什么?

P.S。使用CreateSQLQuery需要,因为我的子对象foo是基于他的父栏创建的,但是bar和foo有相同的Id,并且使用了Table Per Concrete Class

2 个答案:

答案 0 :(得分:0)

在尝试.Get之前提交第一个事务,或者如果您只需要在更新或插入之前将此实体与另一个实体相关联,则可以使用.Load

编写原始sql查询不会保存会话中的内容,因为您不处理实体。

答案 1 :(得分:0)

我找到了解决方案。

就我而言,ISessionProvider有生活方式 - perWebRequest。这意味着在结束Web请求之后提交会话。

下一步。插入后,我们没有实体,但我们可以将基于插入数据创建的新实体与当前会话合并。

session.Merge(new Entity(...));

或者如果您在Persistence Context中有父实体,则需要这样做:

session.Evict(parentEntity);
session.Merge(new Entity(...));

Evict删除带有一些id的实体(child和parent有一些id),否则你会得到一个异常。 这会将实体与当前会话合并,当您使用sessison.Get<MyObjectType>(entityId)对象时,它不会为空。