Spiga

NHibernate之旅(5):探索Insert, Update, Delete操作

2008-10-17 16:31 by 李永京, 23233 visits, 收藏, 编辑

本节内容

  • 操作数据概述
  • 1.新建对象
  • 2.删除对象
  • 3.更新对象
  • 4.保存更新对象
  • 结语

操作数据概述

我们常常所说的一个工作单元,通常是执行1个或多个操作,对这些操作要么提交要么放弃/回滚。想想使用LINQ to SQL,一切的东西都在内存中操作,只有调用了DataContext.SubmitChanges()方法才把这些改变的数据提交到数据库中,LINQ to SQL那么提交要么回滚。

我们使用NHibernate也一样,如果只查询数据,不改变它的值,就不需要提交(或者回滚)到数据库。

注意:这节,我们在上一节源代码的基础上,在数据访问层中新建CRUD.cs类用于编写操作方法,在数据访问的测试层新建一CRUDFixture.cs类用于测试。

1.新建对象

简单描述:新建一个对象;调用ISession.Save();同步ISession。

例子:在数据访问层编写CreateCustomer()方法,把传过来的Customer对象保存在数据库中。

public int CreateCustomer(Customer customer)
{
    int newid = (int)_session.Save(customer);
    _session.Flush();
    return newid;
}

我们测试这个方法,新建一个Customer对象,调用CreateCustomer()方法返回新插入的CustomerId,再次根据CustomerId查询数据库是否存在这个对象。

[Test]
public void CreateCustomerTest()
{
    var customer = new Customer() { Firstname = "YJing", Lastname = "Lee" };
    int newIdentity = _crud.CreateCustomer(customer);
    var testCustomer = _crud.GetCustomerById(newIdentity);
    Assert.IsNotNull(testCustomer);
}

2.删除对象

简单描述:获取一个对象;调用ISession.Delete();同步ISession。

说明:使用ISession.Delete()会把对象的状态从数据库中移除。当然,你的应用程序可能仍然持有一个指向它的引用。所以,最好这样理解:Delete()的用途是把一个持久化实例变成临时实例。 你也可以通过传递给Delete()一个NHibernate 查询字符串来一次性删除很多对象。删除对象顺序没有要求,不会引发外键约束冲突。当然,有可能引发在外键字段定义的NOT NULL约束冲突。

例子:在数据访问层编写DeleteCustomer()方法,从数据库中删除Customer对象。

public void DeleteCustomer(Customer customer)
{
    _session.Delete(customer);
    _session.Flush();
}

我们测试这个方法,在数据库中查询CustomerId为2的Customer对象,调用DeleteCustomer()方法删除,再次根据CustomerId查询数据库是否存在这个对象。

[Test]
public void DeleteCustomerTest()
{
    var coutomer = _crud.GetCustomerById(2);
    _crud.DeleteCustomer(coutomer);
    var testCustomer = _crud.GetCustomerById(2);
    Assert.IsNull(testCustomer);
}

3.更新对象

简单描述:获取一个对象;改变它的一些属性;调用ISession.Update();同步ISession。

例子:在数据访问层编写UpdateCustomer()方法,修改Customer对象。

public void UpdateCustomer(Customer customer)
{
    _session.Update(customer);
    _session.Flush();
}

测试这个方法,在数据库中查询CustomerId为1的Customer对象并修改它的Firstname属性值,调用UpdateCustomer()方法更新,再次查询数据库中CustomerId为1的Customer对象的Firstname值为修改之后的值。

[Test]
public void UpdateCustomerTest()
{
    var customer = _crud.GetCustomerById(1);
    customer.Firstname = "liyongjing";
    _crud.UpdateCustomer(customer);
    var testCustomer = _crud.GetCustomerById(1);
    Assert.AreEqual("liyongjing", customer.Firstname);
}

4.保存更新对象

你会不会想出这个问题?哪些是刚刚创建的对象,哪些是修改过的对象?对于刚刚创建的对象我们需要保存到数据库中,对于修改过的对象我们需要更新到数据库中。

幸好,ISession可以识别出这不同的对象,并为我们提供了ISession.SaveOrUpdate(object)方法

ISession.SaveOrUpdate(object)方法完成如下工作:

  • 检查这个对象是否已经存在Session中。
  • 如果对象不在,调用Save(object)来保存。
  • 如果对象存在,检查这个对象是否改变了。
  • 如果对象改变,调用Update(object)来更新。

看看下面例子说明了这种情况,在数据访问层编写SaveOrUpdateCustomer()方法,保存更新Customer对象列表,依次遍历列表中的Customer对象,调用ISession.SaveOrUpdate(object)方法保存更新每个Customer对象。

public void SaveOrUpdateCustomer(IList<Customer> customer)
{
    foreach (var c in customer)
    {
        _session.SaveOrUpdate(c);
    }
    _session.Flush();
}

测试这个方法,先在数据库中查询Firstname为YJing的Customer对象并修改它的Lastname属性值,这些对象是数据库中存在的,并改变了,然后新建2个Customer对象,这两个对象在数据库中不存在,是新创建的。调用SaveOrUpdateCustomer()方法保存更新对象,即更新前面修改的对象和保存了后面新创建的2个对象。再次查询数据库中Firstname为YJing,Lastname为YongJing的Customer对象是否一致了。

[Test]
public void SaveOrUpdateCustomerTest()
{
    IList<Customer> customers = _crud.GetCustomersByFirstname("YJing");
    foreach (var c in customers)
    {
        c.Lastname = "YongJing";
    }
    var c1 = new Customer() { Firstname = "YJing", Lastname = "YongJing"};
    var c2 = new Customer() { Firstname = "YJing", Lastname = "YongJing"};
    customers.Add(c1);
    customers.Add(c2);
    int initiaIListCount = customers.Count;

    _crud.SaveOrUpdateCustomer(customers);

    int testListCount = _crud.GetCustomersByFirstnameAndLastname("YJing", "YongJing").Count;
    Assert.AreEqual(initiaIListCount, testListCount);
}

结语

当然,这一节操纵对象操作,在NHibernate中涉及了对象的状态, 对象对一个特定的ISession来说,有三种状态分别是:瞬时(transient)对象、持久化(persistent)对象、游离(detached)对象。这一节没有说到了,以后在讨论Session的时候再介绍。

本系列链接:NHibernate之旅系列文章导航

NHibernate Q&A

下次继续分享NHibernate!

标签: NHibernate
Add your comment

66 条回复

  1. #1楼 任力      2008-10-17 16:32
    做个沙发~~~
    顶永京,然后再看~~
     回复 引用 查看   
  2. #2楼 Jason Cui      2008-10-17 16:34
    不要用NHibernate做高负载网站(5W pv/天)。
     回复 引用 查看   
  3. #3楼[楼主] 李永京      2008-10-17 16:37
    @Jason Cui
    "5W pv/天"具体什么意思啊?可以详细说明下吗?
     回复 引用 查看   
  4. #4楼[楼主] 李永京      2008-10-17 16:38
    @任力
    呵呵,你做沙发,我做板凳....在你下面。
     回复 引用 查看   
  5. #5楼 Jason Cui      2008-10-17 16:38
    就是说如果你的网站流量在每天5W PV以上,最好别用NHibernate,找个更轻量的实现方式。
     回复 引用 查看   
  6. #6楼 小狼壮壮      2008-10-17 16:41
    @李永京
    PV=Page View
    每天的页面访问量
     回复 引用 查看   
  7. #7楼[楼主] 李永京      2008-10-17 16:41
    @Jason Cui
    那就用ADO.NET吧,这个最快,或者用博客园的NBear框架。
     回复 引用 查看   
  8. #8楼[楼主] 李永京      2008-10-17 16:42
    @小狼壮壮
    谢谢!知道了~~
     回复 引用 查看   
  9. #9楼 Jason Cui      2008-10-17 16:53
    NBear是不是已经一年没更新了?

    我们现在正在测试DBEntry,号称跟ADO.Net效率差不多。
     回复 引用 查看   
  10. #10楼[楼主] 李永京      2008-10-17 17:01
    @Jason Cui
    DBEntry没有听说,呵呵,是http://www.codeplex.com/DbEntry 吗?
    NBear的确很久没有更新了~~
     回复 引用 查看   
  11. #11楼 Jason Cui      2008-10-17 17:08
    是这个,用起来非常方便,大小型项目都很方便。
     回复 引用 查看   
  12. #12楼[楼主] 李永京      2008-10-17 17:56
    @Jason Cui
    好的,以后有空试试这个框架~~~
     回复 引用 查看   
  13. #13楼 kiler      2008-10-17 18:40
    @Jason Cui
    高负载网站大部分都是用静态页技术了,采用什么技术访问数据基本对系统没有什么影响。
     回复 引用 查看   
  14. #14楼[楼主] 李永京      2008-10-17 18:45
    @kiler
    说的也是,在使用静态页也是一方面,但是涉及数据操作的时候,就要考察数据访问的东西了,但是好像访问网站还是基本的显示数据,对于操作数据不是很多。
     回复 引用 查看   
  15. #15楼 侯垒      2008-10-17 18:46
    又出新内容了.支持.
     回复 引用 查看   
  16. #16楼[楼主] 李永京      2008-10-17 18:46
    @侯垒
    谢谢支持!欢迎一起讨论~~
     回复 引用 查看   
  17. #17楼 Astar      2008-10-17 19:08
    支持!
     回复 引用 查看   
  18. #18楼 kiler      2008-10-17 19:11
    @李永京
    就算是操作数据那也就是操作几条数据而已,撑死几十几百条就差不多了,用Nhibernate不会成为系统的瓶颈,还有一个耗性能的就是检索数据,但是这个可以用lucece做索引,实际上也不直接访问数据库了,所以说网站这种东西设计好了,直接要和数据库打交道的地方还真不多。
     回复 引用 查看   
  19. #19楼[楼主] 李永京      2008-10-17 19:33
    @Astar
    谢谢支持~~
     回复 引用 查看   
  20. #20楼 Gray Zhang      2008-10-17 21:49
    配置得好NHibernate做5W pv/day没问题的,二级缓存控制得好一点
     回复 引用 查看   
  21. #21楼 Jason Cui      2008-10-17 22:04
    也就是操作几条数据……无语了。要么你是超级高手,要么你就是无知者无畏了。
     回复 引用 查看   
  22. #22楼[楼主] 李永京      2008-10-17 22:09
    关于性能方面各有各的说法和做法,不必争辩了,大家可以写写出来一起讨论,NHibernate作为比较经典的框架在这方面已经很好了,关于性能在于我们如何编写程序,如何考虑效率最优,这才是最重要的~~
     回复 引用 查看   
  23. #23楼 TG[未注册用户]2008-10-18 01:06
    你写的Test,比如测试Insert的那个,只能跑一遍吧,当你要跑第二遍测试的时候会报错吧
     回复 引用   
  24. #24楼 kiler      2008-10-18 10:21
    @Jason Cui
    那你说说我怎么个无知无畏了,你给说说一个网站里面有那些页面需求需要操作超过几十条数据的,仅限前台页面,我说的数据操作仅限数据添加删除修改。
     回复 引用 查看   
  25. #25楼[楼主] 李永京      2008-10-18 10:27
    @TG
    当然啦,因为数据库在第一遍的时候已经有数据了,请清空数据库。
     回复 引用 查看   
  26. #26楼 Jason Cui      2008-10-18 17:35
    @kiler
    一个人5条,5万人就是25万条了。
     回复 引用 查看   
  27. #27楼 kiler      2008-10-18 21:13
    @Jason Cui
    有你这么算的吗,5万人25万条又不是同时操作,每天5W PV,这是一天的访问量,50000/12(一天访问量算是集中在半天之内吧)/3600(平均到秒)=1.15次/秒,这还是在你的网站所有操作请求都是要插入或者是更新修改5条记录的情况下,服务器负担会很大吗?我说过了对于大多数网站访问者来说,查询数据才是主要操作,真正的数据添加删除修改操作很少。NHibernate连续操作数据并不弱,我有过测试,连续插入10w条记录耗时71s,25w数据分到1小时的时间插入轻轻松松。你用不好NHibernate就别怪NHibernate不好。
     回复 引用 查看   
  28. #28楼[楼主] 李永京      2008-10-18 21:36
    @kiler
    有道理,支持一下~~~
     回复 引用 查看   
  29. #29楼 Jason Cui      2008-10-18 22:08
    嗯,出了问题的时候再换解决方案也不迟。
     回复 引用 查看   
  30. #30楼 Gray Zhang      2008-10-19 11:58
    @TG
    加上事务测试后回滚就行
     回复 引用 查看   
  31. #31楼 sagacite      2008-11-30 13:36
    对于社区性质的大型网站,插入更新数据会非常频繁。想想新浪搜狐一些热门新闻的评论,汶川地震时百度贴吧的发帖。。。
    大型网站性能优化的要点,是尽量减少每一个请求的处理时间。有时候时间长了那么一点点,服务器就顶不住。原因在于webserver(如iis)会把用户的请求排在队列里,如果前面的请求处理晚了,阻塞了后面的请求,那么后面的请求队列就会越来越长,导致一些请求发生超时。。。当然,有钱的企业对这个问题根本不怕,他们只需要加前台web服务器就行了,这样请求队列就分散开了。
    用nh做大型网站,跟ado。net相比,只是在前台web服务器上性能低了一点点,对于数据库服务器的性能损耗来说是一样的,没啥区别。所以nh的性能问题完全可以用钱来解决。
    这就要衡量时间和金钱二者的轻重地位。如果你要效率,不怕花钱,就用orm没事。
    如果你很穷,还用一台p4服务器跑web又跑db,那么还是多花时间写效率高的程序吧。
     回复 引用 查看   
  32. #32楼 icemanpro[未注册用户]2008-12-10 17:14
    update是否成功,有没返回状态?
     回复 引用   
  33. #33楼[楼主] 李永京      2008-12-10 17:16
    @icemanpro
    看下一篇使用事务,或者使用拦截器对其操作
     回复 引用 查看   
  34. #34楼 icemanpro[未注册用户]2008-12-11 16:52
    删除某个范围的记录,应如何写?
     回复 引用   
  35. #35楼 Martin_X[未注册用户]2009-01-31 22:45
    非常感谢分享,看到LZ的文章很有启发!
    希望楼主能够在以后写一些Spring.NET的文章,再次表示感谢!
     回复 引用   
  36. #36楼 张跃      2009-02-18 23:35
    老大,我做到这里出现一个问题:
    在测试SaveOrUpdate的方法中基本结构和你的一样,可是出现了一个a different object with the same identifier value was already associated with the session:0,of entity:Model.Entities.Customer.错误
    Google了一下说是SaveOrUpdateCopy()方法或者session.clean可以解决,但是我不太清楚如果执行了上面的方法会发生什么事,希望您能解释一下,谢谢哈。
    至于发生这个问题的原因又是什么,是不是和我的测试代码有关系呢?
     回复 引用 查看   
  37. #37楼 张跃      2009-02-20 14:17
    @张跃
    发现问题所在了,是我用了1.2的hbm映射文件了,前面CRUD都没有出问题,我还以为没有问题了呢
     回复 引用 查看   
  38. #38楼[楼主] 李永京      2009-02-26 18:03
    @icemanpro
    使用where啊,between with
     回复 引用 查看   
  39. #39楼[楼主] 李永京      2009-02-26 19:09
    @Martin_X
    呵呵,谢谢支持
     回复 引用 查看   
  40. #40楼 sig556      2009-03-26 22:06
    看了大家的见解,收获很大。
     回复 引用 查看   
  41. #41楼 liuxue[未注册用户]2009-03-31 10:23
    博主你好,最近在学习NHibernate,在运行你的范例的时候发现一个奇怪的现象,在测试CreateCustomer()方法的时候,单元测试可以通过但是打开数据表的时候却没有发现对应的记录,想请教一下是怎么回事,谢谢
     回复 引用   
  42. #42楼 denli2009-04-14 21:43
    我想请教一个问题:
    一般情况下,我会将数据表的明细数据绑定到一个数据显示控件中(例如:DatagridView), 在这个数据显示控件中后我可能既会对数据有增加操作,亦会有数据的修改或删除操作,例如在一个Datagridview查询出来共有10条数据,我先删除了其中的2条,修改了其中的9条,然后又新增了4条数据,那末就等于我对数据做了9次操作,按照说明我就要9次调用数据库表,10次对datagridview进行绑定。这样的话岂不是增加服务器的负担。

    有没有一个办法,可以让我在数据实体中对数据进行操作,完成数据的增删改后,触发某个命令后,程序再将我所作的修改持久化到数据库中呢?

    请指教!
     回复 引用   
  43. #43楼[楼主] 李永京      2009-04-14 22:13
    @denli
    建议了解一下UnitOfWork
    还有,有时为了业务逻辑,还不得不这样做
     回复 引用 查看   
  44. #44楼 Dylan.S.Ma      2009-06-02 13:38


    LZ你 好。 对NHibernate 我不太了解其中机制。 麻烦问下。在大型的ERP(WPF) 中使用这种ORM的方式能够节省维护成本吗?其中本身就已经使用Cache 的一个中间层

    但是还要考虑的是开发人员的学习成本还有 NHibernate的稳定性,可靠性

    麻烦给点建议
     回复 引用 查看   
  45. #45楼[楼主] 李永京      2009-06-02 13:53
    @Dylan.S.Ma
    你是WPF+NHibernate程序?这要看公司情况了,NHibernate虽然说是一个小小的数据持久化框架,但是非常复杂,要了解其功能,实现不是一件非常容易的事情,学习成本很高,例外NHibernate没有大型架构的例子,所以只能自己去探索,这条路也很长。如果你对NHibernate机制非常清楚,使用起来得心应手,NHibernate内部机制就是基于监听、事件的机制....至于Cache,二级缓存也没有例子。
     回复 引用 查看   
  46. #46楼 level0[未注册用户]2009-07-04 09:41
    NHibernate: INSERT INTO customer (firstName, lastName) VALUES (@p0, @p1); select SCOPE_IDENTITY(); @p0 = '三', @p1 = '德子'
    TestCase 'DAL.Test.CRUDTest.CreateCustomerTest'
    failed: NHibernate.Exceptions.GenericADOException : could not insert: [DomainModel.Entities.Customer][SQL: INSERT INTO customer (firstName, lastName) VALUES (?, ?); select SCOPE_IDENTITY()]
    ----> System.Data.SqlClient.SqlException : 不能将值 NULL 插入列 'customerId',表 'NHibernateSample.dbo.customer';列不允许有空值。INSERT 失败。
    语句已终止

    ////////////////////我的代码/////////////////////////////////////////////
    [Test]
    public void CreateCustomerTest()
    {
    var customer = new Customer {FirstName = "三", LastName = "德子" };
    int customerId = _crud.CreateCustomer(customer);
    IList <Customer> newCustomer =_crud .GetCustomerById(customerId);
    /* _crud.DeleteCustomerUseTransaction(newCustomer);
    IList<Customer> testCustomer = _crud.GetCustomerById(1);
    Assert.IsNull(testCustomer);*/
    }

    ////////////////////////////////////////////////////////////////////////////
    李大师,为什么我的会报错呢?
     回复 引用   
  47. #47楼 传说中的祥哥      2009-07-04 12:05
    对于Nhibernate的更新机制,我不是很了解,如果你在表中没有设置主键,还能完成吗?
     回复 引用 查看   
  48. #48楼 MicroCoder      2009-07-07 20:36
    前一段时间在学linq to sql,现在开始学习Nhibernate,觉得入门太困难了,一方面是资料太少了,几乎就是看英文资料,还有可能就是习惯了微软工具的便利性。这段时间一直在看你的这个系列。现在有些疑问希望得到你的点播:
    就拿这篇来说,那个更新和删除也太笨拙了,先要把实体查询出来,linq to sql 也有这个问题,但是有解决办法。不知道Nhibernate怎么解决这样问题?
    还有就是学着学着迷惑了,不知道为什么要学这个ORm工具了,反正觉得linq to sql很方便,至少现在觉得是这样的。
    另外有没有用Nhibernate作数据访问层的好一点的源码可以下来研究一下呢?
    希望能够得到解答。thanks :-D
     回复 引用 查看   
  49. #49楼 我的昵称[未注册用户]2009-08-23 10:38
    我有两个问题

    一是源码里好像没看到关闭 sesssion

    二是,如果是asp.net,将 trust level 设为 Medium, 那么nhb不能运行.搜过很多东西,没有完整的,可以通过的示例,非常恼火.

    谢谢.
     回复 引用   
  50. #50楼 yage[未注册用户]2009-10-05 01:17
    我也出现了46楼的错误,我的代码如下:
    public void CreateUser()
    {
    Customer customer = new Customer() {CustomerId = 4, Name = "aaa", Phone = "13388333388"};
    var newid = _sample.CreateCustomer(customer);
    var testCustomer = _sample.GetCustomerById(newid);
    Assert.NotNull(testCustomer);
    Assert.AreEqual(4,testCustomer。CustomerId);
    }
    主键CustomerId我命名给赋值了,而且没有使用自增列。
    异常信息如下:
    ***** DAL.Test.NHibernateSampleFixture.CreateUser
    NHibernate: INSERT INTO Customer (Name, Phone) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'aaa', @p1 = '13388333388'
    00:52:52,000 ERROR [TestRunnerThread] AbstractBatcher [(null)]- Could not execute query: INSERT INTO Customer (Name, Phone) VALUES (@p0, @p1); select SCOPE_IDENTITY()
    System.Data.SqlClient.SqlException: 不能将值 NULL 插入列 'CustomerId',表 'NHibernateSample.dbo.Customer';列不允许有空值。INSERT 失败。
    请博主指点一下,谢谢
     回复 引用   
  51. #51楼 迭戈_Forever      2009-10-12 11:27
    @denli
    可以这样做:
    在grid里面,每一行对象可以看成是一个对象,对于这个对象,可以增加一个属性,来标记这个对象是被怎么操作了,比如对于添加一行,可以将该对象的状态标记为“Insert”,等等。当你做完所有的操作,点击Save按钮的时候,把你操作的所有行(也就是所有的对象),放到一个集合里面(建议使用泛型),传到你的数据库访问层,遍历这个集合,根据状态进行相应的操作。
     回复 引用 查看   
  52. #52楼 cohoo[未注册用户]2009-10-14 17:04
    @yage
    我也遇到过这个问题,
    对于出现的错误,需要用ISession.Save(object obj,object id),这个方法插入就可以,至于用ISession.Save(object obj)插入不了的原因,我也不是很清楚。还得劳请博主指点了。
     回复 引用   
  53. #53楼 TM Zhang      2009-10-16 11:29
    thanks for sharing :)
    Jack
     回复 引用 查看   
  54. #54楼 Cheese      2009-10-23 15:21
    作为工作单元就是记录业务过程中对数据有影响的所有变化,对实体的增、删、改都应该注册到工作单元中去,工作单元在提交的时候一并对这些实体的操作提交到数据库中。
    所以,我不太理解楼主为什么会有SaveOrUpdateCustomer,这种针对某个实体的特定方法。

    我理想中的Session是这样的:
    ====伪代码============
    find出两个实体
    using(ISession session = Session.Open())
    {
    实体1.属性 = value;
    ....
    实体2.属性 = value;
    ....

    session.Commit();
    }
    =======================
    以上的想法基本上是基于《企业架构模式》
    对于NHibernate我还是个初学者,所以请楼主不吝赐教。
     回复 引用 查看   
  55. #55楼[楼主] 李永京      2009-10-23 23:00
    @Cheese
    自己写的方法,其实就是ISeesion.SaveOrUpdate(对象)
     回复 引用 查看   
  56. #56楼 铃梦当当      2010-03-30 13:35
    int newid = (int)_session.Save(customer)

    为什么我在用类似的用法的时候会报错呢LZ?

    session.Save(实体) 这个有返回值吗?
     回复 引用 查看   
  57. #57楼[楼主] 李永京      2010-03-30 13:58
    有重载方法的。
     回复 引用 查看   
  58. #58楼 庹庹      2010-05-21 12:59
    update()方法的返回值?
     回复 引用 查看   
  59. #59楼[楼主] 李永京      2010-05-21 13:10
    @庹庹
    没有返回值啊
     回复 引用 查看   
  60. #60楼 庹庹      2010-07-27 20:12
    我是想知道insert() update()方法的返回值是什么?是影响的行数还是数据库表的主键?
     回复 引用 查看   
  61. #61楼[楼主] 李永京      2010-07-27 20:29
    @庹庹
    没有返回值,他仅是修改对象的状态,真正的提交在事务Commit或者Session.Flush的时候
     回复 引用 查看   
  62. #62楼 impth      2010-11-20 15:49
    此文不错,值得推荐!
     回复 引用 查看   
  63. #63楼 huaangjin      2011-06-19 10:46
    我在更新父对象的时候为什么子对象老是会丢失了?
    在Update(goods)之前还可以看到goods里面的各个子对象都是好的,但是执行完这句后就会有些子对象就会丢失,而且好像还是随机丢失的!
    比如说商品对象原先存在一个关于图片的子对象,在程序里面给它多加了一张图片(没有ID),然后更新,原先的图片没了,但是新增的又有了,或者两个都没了!而且赠品也会跟着没了,但有时候赠品又有!
     回复 引用 查看   
  64. #64楼 黑炭xiaOt      2011-07-28 16:38
                using (ISession session = Session.OpenSession())
                {
                   
                }
    

    为啥执行这个的时候老是报错啊
     回复 引用 查看   
  65. #65楼 tianyaxiang      2011-08-15 17:57
    你好啊, _session.Flush(); 这个写入数据是必须加的吗,有个疑问是有个同事,不加这句就可以提交到数据库,而为不加它就不行,是什么原因呢?
     回复 引用 查看   
  66. #66楼 darklx      2011-11-09 16:40
    我想知道,NHibernate跟Linq相比,性能如何?
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1313612 +j4eyrtQWnE=