nhaibernate对象不宜随意更改值
如题,深刻的教训。
详细点说,就是从数据库中获得的NHibernate对象,不能当成普通的实体类对象,比如为了方便传参数,将里面的属性赋值。这种对象里面还有许多私有属性,实则与数据库有着千丝万缕的关系。如果此时将会话提交,不管有没有显式提交该对象,数据库都会发生改变。
示例:
Person p1 = personRepository.GetAll().Where(s => s.Name = "张三").FirstOrDefault();
Person p2 = personRepository.GetAll().Where(s => s.Name = "李四").FirstOrDefault();
var topmans = getTopMan(p1);
var guys = getGuys(p2);
...
unitOfWork.Begin();
employeeRepository.Add(topmans);
employeeRepository.Add(guys);
/*
提交之后,发现数据库中张三的类型变成了"牛逼人物",李四变成了"小喽啰"
但是,我们并没有提交p1和p2
可见,在NHiberNat中,事务提交时,会将同一个session里面的所有改动都持久化到数据库中,不管有没有显式调用。
*/
unitOfWork.Commit();
private IList<Employee> getTopMan(Person person)
{
person.Type = "牛逼人物";
var topmans = getEmpolyees(person);
...
return topmans;
}
private IList<Employee> getGuys(Person person)
{
person.Type = "小喽啰";
var guys = getEmpolyees(person);
...
return guys;
}
提交之后,发现数据库中张三的类型变成了"牛逼人物",李四变成了"小喽啰"
但是,我们并没有提交p1和p2
可见,在NHiberNat中,事务提交时,会将同一个session里面的所有改动都持久化到数据库中,不管有没有显式调用。
浙公网安备 33010602011771号