如果使用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
答案 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)
对象时,它不会为空。