NHib 3配置&映射返回空结果?

时间:2013-02-20 20:34:44

标签: linq oracle nhibernate odp.net nhibernate-3

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

我确定我做错了什么,这让我开了个墙。 :)

背景/设置

  • IBM有一个名为Maximo的产品的Oracle 11g数据库
  • 此产品有一个名为workorder的表,列出了工作人员;该表有一个名为“wonum”的字段,表示唯一的工单号。
  • 我有一个“报告”用户,可以通过maximo架构访问该表
    • e.g。 “select * from maximo.workorder”
  • 我正在使用Oracle的Managed ODP.NET DLL来完成数据任务,并且是第一次使用它。

我尝试过的事情

  • 我创建了一个基本的控制台应用程序来测试这个
  • 我在master分支上的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();

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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();