如何使用 Fluent nhibernate 正确更新行?

Posted

技术标签:

【中文标题】如何使用 Fluent nhibernate 正确更新行?【英文标题】:How to properly update row with Fluent nhibernate? 【发布时间】:2014-12-01 12:48:09 【问题描述】:

我有第二个映射:

public class OrderMap : ClassMap<tOrder>

    public OrderMap()
    
        Table("tOrder");

        Id(m => m.Id, "Ref").GeneratedBy.Native();

        Map(m => m.OrderNo);
        Map(m => m.Taken);
        Map(m => m.DateRequired);

        Component(x => x.Process, m =>
        
            m.Map(x => x.ProcessId);
        );

        References(x => x.Customer, "CustomerId").ReadOnly();
    

当我从数据库中获取数据时工作正常,但是,当我更改某些字段并尝试更新数据库中的数据时,我收到错误:批量更新返回意外更新的行数;实际行数:2;预期:1(在事务提交时)。

我试图找到答案,我找到的解决方案之一是:

SET NOCOUNT ON;

在触发器中。 触发器不是我的,所以我无法更改它,实际上我认为我在映射中遗漏了一些东西。

如何解决这种错误,我做错了什么?

P.S 对不起,我的英语不好。

【问题讨论】:

你是在坚持你的“ISession”......还是在重新创建它......你需要它?这是一个很大的区别..以及“连接”和“断开连接”之间的区别.. 【参考方案1】:

如果您正在尝试更新您的实体........但是在“断开连接模式”下进行(根据需要创建 ISession ..(而不是持续存在的 ISession)。 ......那么你可能想要使用 .Merge() 方法。

但是你需要弄清楚你是在连接还是断开连接......它会改变你将使用的“策略”和代码。

public void UpdateMyNHiberateEntity(MyNHiberateEntity item)

    using (ISession session = ISessionCreator.OpenSession()) /* You won't have this method probably, but your code will create a new ISession here */
    
        using (ITransaction transaction = session.BeginTransaction())
        
            session.BeginTransaction();
            MyNHiberateEntity mergedItem = session.Merge(item);
            transaction.Commit();
        
    

【讨论】:

以上是关于如何使用 Fluent nhibernate 正确更新行?的主要内容,如果未能解决你的问题,请参考以下文章

Fluent NHibernate Composite Id 长度设置不正确

通过(Fluent)NHibernate添加到SQLite DB时,DateTime不正确

如何使用 Fluent 设置 NHibernate.Burrow?

Fluent NHibernate - HiLo 方案的 PersistenceSpecification

如何使用 Fluent-NHibernate 和 MySQL 指定自动递增 (int) 标识列

Fluent NHibernate - NHibernate.QueryException:无法解析属性