首页 > 代码库 > 01-03-02-2【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作-Save方法的一些问题

01-03-02-2【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作-Save方法的一些问题

NHibernate--Save方法:   

 

CustomerService.cs

 1         public void Save(Customer customer)
 2         {
 3             ISession session = _sessionManager.GetSession();
 4             ITransaction transaction = session.BeginTransaction();
 5 
 6             try
 7             {
 8                 session.Save(customer);
 9                 transaction.Commit();
10             }
11             catch (Exception)
12             {
13                 transaction.Rollback();
14                 throw;
15             }
16             finally
17             {
18                 session.Close();
19             }
20         }
View Code

 


添加实体对象后,修改值,调用save方法,修改后的实体对象被作为新的实体对象保存到数据库。所以,建议调用session的SaveOrUpadate或Update方法

如下图所示:

 

 

再次测试,从表实体对象是否也会被当做新的实体重复添加:

测试表明:
1.主表的修改后实体对象显示调用Save会被当新的实体对象添加到数据库。

2.从表的配置 unsaved-value="http://www.mamicode.com/0":Nhibernate自动取从表实体的Id与unsaved-value比较,自动决定调用Save还是Update。

   从表实体对象没有会被当做新的实体重复添加

3.有意思的是:从表的实体对象关联的主表实体发生了改变。原来关联的CustomerId=77,

  修改有再次调用主表对象customer(原来CustomerId=77,修改后变成CustomerId=78,)显示调用Save方法,从表的实体对象关联的CustomerId=78,

 

第三次测试,注释了表的配置 unsaved-value="http://www.mamicode.com/0",从表实体对象是否也会被当做新的实体重复添加

如下图测试:

  经测试表明:

    注释了表的配置 unsaved-value="http://www.mamicode.com/0"

   从表实体对象没有会被当做新的实体重复添加

  这说明我的这一文章:

01-03-01【Nhibernate出入江湖】id标签的unsaved-value属性

  是多少有点骗人的成分,不过最好还是加上吧,可能存在版本的问题以及兼容旧版本(我的Nhibernate版本是NHibernate-3.3.3.CR1-bin)。

  还是那句话话:宁可信其有,不可信其无。

 

 

结论:

     搞了这多测试,session的Save方法TMD的压根就是添加一个新实体。不包含任何更新,就知道创建新的。

还有就是你TMD新增就新增,还把原来的实体的子表对象一起联级夺走,你TMD的到底要干什么。

真不知道Save有个屁用。我草!!!!!!!!!

建议调用session的SaveOrUpadate或Update方法