NHib 3 Configuration & Mapping возвращает пустые результаты?

Примечание: я специально не использую Fluent NHibernate, но использую встроенный в 3.x стиль отображения. Тем не менее, я получаю пустой набор записей, когда думаю, что мне нужно возвращать записи.

Я уверен, что делаю что-то не так, и это сводит меня с толку.:)

Фон / Настройка

  • У меня есть база данных Oracle 11g для продукта IBM под названием Maximo
  • Этот продукт имеет таблицу под названием workorder, в которой перечислены рабочие заказы; в этой таблице есть поле с именем "wonum", которое представляет уникальный номер рабочего задания.
  • У меня есть пользователь "отчетности", который может получить доступ к таблице через схему maximo
    • например, "выбрать * из maximo.workorder"
  • Я использую Oracle Managed ODP.NET DLL для выполнения задач с данными и использую ее впервые.

Вещи, которые я пробовал

  • Я создал базовое консольное приложение, чтобы проверить это
  • Я добавил OracleManagedClientDriver.cs из NHibernate.Driver в основную ветку (он официально не входит в версию, которую я использую).
  • Я создал POCO с именем WorkorderBriefBrief, который имеет только поле 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();
            }
        }
    }
}

Заранее спасибо за любую помощь, которую вы можете оказать!

Обновить

Следующий код (стандартный ADO.NET с OracleDataReader) работает нормально, возвращая 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 ответа

Решение

Я нашел ответ - благодаря первоначальному предложению Оскара я понял, что дело не только в том, что я не добавил сборку, мне также нужно было создать новый картограф.

чтобы сделать это, я добавил следующий код в конфигурацию перед сборкой фабрики сессий:

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();

При настройке NHibernate, вам нужно рассказать о ваших сопоставлениях.

Другие вопросы по тегам