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里面的所有改动都持久化到数据库中,不管有没有显式调用。

posted on 2023-06-16 17:32  左直拳  阅读(0)  评论(0)    收藏  举报  来源

导航