linq - NHib 3 配置和映射返回空结果?

标签 linq oracle nhibernate odp.net nhibernate-3

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

我确信我做错了什么,这让我陷入困境。 :)

背景/设置

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

我尝试过的事情

  • 我创建了一个基本的控制台应用程序来测试它
  • 我在 master 分支上添加了来自 NHibernate.Driver 的 OracleManagedClientDriver.cs(它不是​​我正在使用的正式版本中的)。
  • 我创建了一个名为 WorkorderBriefBrief 的 POCO,它只有一个 WorkorderNumber 字段。
  • 我创建了一个类映射 WorkorderBriefBriefMap,它仅将该值映射为只读值。
  • 我创建了一个带有控制台输出的控制台应用程序,以尝试编写工单行。
  • session 和事务似乎打开正确,
  • 我测试了连接字符串的标准 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();

最佳答案

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

关于linq - NHib 3 配置和映射返回空结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14989379/

相关文章:

java - Oracle NoSQL 的主要和次要路径/组件

java - Oracle JDBC 瘦客户端 64 位

c# - 如何使用服务处理 NHibernate session 生命周期?

c# - 如何根据用户输入动态构建和返回 linq 谓词

c# - LINQ to Entities 无法识别表达式内的方法

sql - 不满足多个条件之一时返回行

c# - 使用 LINQ 选择本周

c# - "The given key was not present in the dictionary"nHibernate C#

c# - QueryOver:从子查询中选择列