2

注意:我特别不使用 Fluent NHibernate,而是使用 3.x 的内置映射样式。但是,当我认为应该返回记录时,我得到了一个空白记录集。

我确定我做错了什么,它把我逼到了墙角。:)

背景/设置

  • 我有一个名为 Maximo 的 IBM 产品的 Oracle 11g 数据库
  • 该产品有一个名为 workorder 的表格,其中列出了工作订单;该表有一个名为“wonum”的字段,它代表一个唯一的工作订单号。
  • 我有一个“报告”用户,可以通过 maximo 模式访问表
    • 例如“从 maximo.workorder 中选择 *”
  • 我正在使用 Oracle 的托管 ODP.NET DLL 来完成数据任务,并且是第一次使用它。

我尝试过的事情

  • 我创建了一个基本的控制台应用程序来测试它
  • 我在主分支上添加了 NHibernate.Driver 中的 OracleManagedClientDriver.cs(我正在使用的版本中没有正式发布)。
  • 我创建了一个名为 WorkorderBriefBrief 的 POCO,它只有一个 WorkorderNumber 字段。
  • 我创建了一个类映射 WorkorderBriefBriefMap,它只将该值映射为只读值。
  • 我创建了一个带有控制台输出的控制台应用程序来尝试编写工单行。
  • 会话和事务似乎正确打开,
  • 我测试了一个标准 ODP.NET OracleConnection 到我的连接字符串

编码

POCO:WorkorderBriefBrief.cs

namespace PEApps.Model.WorkorderQuery
{
    public class WorkorderBriefBrief
    {
        public virtual string WorkorderNumber { get; set; }

    }
}

映射:WorkorderBriefBriefMap.cs

using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Conformist;
using PEApps.Model.WorkorderQuery;

namespace ConsoleTests
{
    public class WorkorderBriefBriefMap : ClassMapping<WorkorderBriefBrief>
    {
        public WorkorderBriefBriefMap()
        {
            Schema("MAXIMO");
            Table("WORKORDER");


            Property(x=>x.WorkorderNumber, m =>
                {
                    m.Access(Accessor.ReadOnly);
                    m.Column("WONUM");
                });
          }
    }
}

放在一起:Program.cs

namespace ConsoleTests
{
    class Program
    {
        static void Main(string[] args)
        {
            NHibernateProfiler.Initialize();
            try
            {
                var cfg = new Configuration();
                cfg
                   .DataBaseIntegration(db =>
                   {
                       db.ConnectionString = "[Redacted]";
                       db.Dialect<Oracle10gDialect>();
                       db.Driver<OracleManagedDataClientDriver>();
                       db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
                       db.BatchSize = 500;
                       db.LogSqlInConsole = true;
                   })
                   .AddAssembly(typeof(WorkorderBriefBriefMap).Assembly)
                   .SessionFactory().GenerateStatistics();

                var factory = cfg.BuildSessionFactory();

                List<WorkorderBriefBrief> query;

                using (var session = factory.OpenSession())
                {
                    Console.WriteLine("session opened");
                    Console.ReadLine();
                    using (var transaction = session.BeginTransaction())
                    {
                        Console.WriteLine("transaction opened");
                        Console.ReadLine();
                        query =
                            (from workorderbriefbrief in session.Query<WorkorderBriefBrief>() select workorderbriefbrief)
                                .ToList();
                        transaction.Commit();
                        Console.WriteLine("Transaction Committed");
                    }
                }

                Console.WriteLine("result length is {0}", query.Count);
                Console.WriteLine("about to write WOs");

                foreach (WorkorderBriefBrief wo in query)                
                {
                    Console.WriteLine("{0}", wo.WorkorderNumber);
                }

                Console.WriteLine("DONE!");
                Console.ReadLine();

                // Test a standard connection below
                string constr = "[Redacted]";

                OracleConnection con = new OracleConnection(constr);
                con.Open();
                Console.WriteLine("Connected to Oracle Database {0}, {1}", con.ServerVersion, con.DatabaseName.ToString());
                con.Dispose();

                Console.WriteLine("Press RETURN to exit.");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error : {0}", ex);
                Console.ReadLine();
            }
        }
    }
}

提前感谢您提供的任何帮助!

更新

以下代码(带有 OracleDataReader 的标准 ADO.NET)可以正常工作,返回应有的 16 个工单编号。对我来说,这表明我对 NHibernate 的使用比 Oracle Managed ODP.NET 更多。所以我希望这只是我在上面的映射或配置中所做的一些愚蠢的事情。

   // Test a standard connection below
            string constr = "[Redacted]";

            OracleConnection con = new Oracle.ManagedDataAccess.Client.OracleConnection(constr);
            con.Open();
            Console.WriteLine("Connected to Oracle Database {0}, {1}", con.ServerVersion, con.DatabaseName);
            var cmd = new OracleCommand();
            cmd.Connection = con;
            cmd.CommandText = "select wonum from maximo.workorder where upper(reportedby) = 'MAXADMIN'";
            cmd.CommandType = CommandType.Text;
            Oracle.ManagedDataAccess.Client.OracleDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine(reader.GetString(0));
            }

            con.Dispose();
4

2 回答 2

2

在配置 NHibernate 时,您需要告诉它您的映射。

于 2013-02-21T07:24:06.787 回答
0

我找到了答案——感谢Oskar 最初的建议,我意识到不仅仅是我没有添加程序集,我还需要创建一个新的映射器。

为此,我在构建会话工厂之前将以下代码添加到配置中:

var mapper = new ModelMapper();

//define mappingType(s) -- could be an array; in my case it was just 1
var mappingType = typeof (WorkorderBriefBriefMap);

//use AddMappings instead if you're mapping an array
mapper.AddMapping(mappingType);

//add the compiled results of the mapper to the configuration
cfg.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());
var factory = cfg.BuildSessionFactory();
于 2013-02-21T14:01:18.770 回答