【问题标题】:NHibernate not saving entityNHibernate 不保存实体
【发布时间】:2015-10-26 17:30:33
【问题描述】:

我有一个项目,我将数据从数据库移动到另一个。我有几张桌子在工作,但当前一张没有。当调用Session.Save(entity) 时似乎没有发生任何事情(没有从 NHibernate 发送插入记录)。未保存的实体是下面代码中的Configuration。我包含了与另一个运行良好的实体相关的其他代码(大约十几个)。数据正在从 Access 数据库传输到 MSSQL 数据库。

复制对象并执行会话保存的代码。在 Configuration 实体上调用 save 时没有插入任何内容。

public void Save(Entities.Access.CompTool o)
{
    var n = new CompTool();
    n.Name = o.Name;
    n.Description = o.Description;
    n.DefaultLocation = o.DefaultLocation;
    n.DateModified = o.DateModified;
    n.OldId = o.Id;

    GetSession().Save(n);
}

public void Save(Entities.Access.Configuration o)
{
    var n = new Configuration();
    n.Name = o.Name;
    n.Description = o.Description;
    n.Value = o.Value;

    GetSession().Save(n);
}

映射Configuration

using TestProg.DatabaseConverter.Entities.Sql;
using FluentNHibernate.Mapping;

namespace TestProg.DatabaseConverter.Mappings.Sql
{
    public class ConfigurationMap : ClassMap<Configuration>
    {
        public ConfigurationMap()
        {
            Table("Configuration");
            Id(x => x.Name).GeneratedBy.Assigned();
            Map(x => x.Value);
            Map(x => x.Description).Column("Desription");
        }
    }
}

映射CompTool

using TestProg.DatabaseConverter.Entities.Sql;
using FluentNHibernate.Mapping;

namespace TestProg.DatabaseConverter.Mappings.Sql
{
    public class CompToolMap: ClassMap<CompTool>
    {
        public CompToolMap()
        {
            Table("CompTools");
            Id(x => x.Id).Column("ID");
            Map(x => x.Name);
            Map(x => x.Description);
            Map(x => x.DefaultLocation);
            Map(x => x.DateModified);
            Map(x => x.OldId);
        }
    }
}

Configuration实体

using System;

namespace TestProg.DatabaseConverter.Entities.Sql
{
    public class Configuration
    {
        public virtual string Name { get; set; }
        public virtual string Value { get; set; }
        public virtual string Description { get; set; }
    }
}

创建Configuration表的代码:

CREATE TABLE Configuration
(
    Name nvarchar(50) PRIMARY KEY,
    Value nvarchar(50) DEFAULT '',
    Desription nvarchar(100) DEFAULT ''
)

【问题讨论】:

  • 为什么要通过代码而不是 SQL 来移动数据?
  • @Andre 因为我部分决定将其用作(重新)熟悉 Fluent NHibernate 的练习,并且数据库还有一些其他“问题”需要更多操作而不仅仅是直接操作复制。

标签: c# nhibernate fluent-nhibernate


【解决方案1】:

session.Save(...) 不代表 SQL INSERT

NHibernate 会话的实例代表一个上下文/工作单元,它(甚至隐藏) DB 操作。

如果需要或我们明确要求,DB WRITE 操作会分批完成。以及我们如何通过调用

来强制执行 WRITE 操作
session.Flush();

检查文档的这些部分(它们都很有帮助,但这些都涵盖了会话及其刷新模式)

2.3. Contextual Sessions

9.6. Flush

ISession 会不时执行同步 ADO.NET 连接状态与内存中对象状态所需的 SQL 语句。

  • 来自Find()Enumerable() 的一些调用
  • 来自NHibernate.ITransaction.Commit()
  • 来自ISession.Flush()

【讨论】:

  • 我知道 save 不一定会立即插入数据库,但它永远不会插入。我不只是在那个电话之后暂停它。我也试过立即冲洗,但仍然没有插入。
  • 会话刷新(或提交时使用 FlushMode 的事务提交)是事件,将发出 INSERT。保存只是如何将实例添加到 ISession 会话中的一种方式。在 Flush 之后,总是会发生 INSERT,或者至少会抛出 Exception。那么你提供了一些例外吗?
  • sigh 我发现这很愚蠢,错误地在访问数据库会话上调用了刷新,而不是 sql 数据库。感谢您的帮助!
  • 很高兴看到这一进展!先生,享受强大的 NHibernate ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多