我正在尝试创建一个具有4个属性的对象; 1x ID和3x对其他表的引用。
我知道我不应该将NHibernate的“ session.Save()”与sql Insert语句进行比较,但是我仍然希望在请求/线程完成后将其保存在数据库中。 这是我的代码:
var session = Home.Instance.GetSession();
session.Begin();
var profile = session.Get<ProfilePO>(profileId);
var queue = session.Get<QueuePO>(queueId);
var telephone = session.Get<TelephonePO>(telephoneId);
var newObject = new UserProfileControlledQueueMembersPO
{
Profile = profile,
Queue = queue,
Telephone = telephone
};
session.Save(newObject);
var idOfNewObj = newObject.Id; //This gets the correct value from the autoincrementing ID in the mysql database.
var newObjFromCacheOrDb = session.QueryOver<UserProfileControlledQueueMembersPO>().Where(x => x.Id == idOfNewObj).List().FirstOrDefault();
//newObjFromCacheOrDb actually return the correct values of the created object
“会话”来自包装类:
private int _transactionCount;
private ITransaction _transaction;
private ISession Session { get; set; }
public void Begin()
{
if (_transactionCount <= 0)
{
_transaction = Session.BeginTransaction();
_transactionCount = 0;
}
_transactionCount++;
}
public object Save<T>(T ob) where T : TEntityType
{
if (_transactionCount <= 0)
throw new Exception("Save is not allowed without an active transaction!");
return Session.Save(ob);
}
在NHibernate的日志中,我发现了这一点:
DEBUG NHibernate.SQL(空)-插入到Profile_Queue_Telephone(ProfileId,QueueId,TelephoneId)值(?p0,?p1,?p2);? p0 = 7283 [Type:Int32(0:0:0)], ?p1 = 27434 [Type:Int32(0:0:0)],?p2 = 26749 [Type:Int32(0:0:0)]
调试NHibernate.SQL(空)-选择LAST_INSERT_ID()
DEBUG NHibernate.SQL(空)-选择this_.Id作为id1_45_0_,this_.ProfileId作为profileid2_45_0_,this_.QueueId作为queueid3_45_0_,this_.TelephoneId作为电话4_45_0_ FROM Profile_Queue_Telephone this_ WHERE this_.Id =?p0;?p [Type:Int32(0:0:0)]
我很困惑为什么不在数据库上执行此操作,因为NHibernate清楚地将其存储在某种缓存中,因为我能够检索数据。 如果是由于回滚,我假设日志中已经说明了该回滚发生在MySql服务器上。
所以我的问题是我在这里缺少什么,我该怎么做才能将对象插入数据库?
编辑:
可能值得一提的是,我对NHibernate还是很陌生。我正在用NHibernate编写一个有4年以上历史的项目。
答案 0 :(得分:2)
您的包装器方法session.Begin()
启动事务,但是您从不调用相应的Commit
来将更改永久保存到数据库。否则,更改将被回滚,并且数据库将保持不变。您的包装器方法之一应该是调用_transaction.Commit
,找到该方法并调用它。