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, вам нужно рассказать о ваших сопоставлениях.