Linq NHib 3配置和映射是否返回空结果?
注意:我不是特别使用Fluent NHibernate,而是使用3.x的内置映射样式。然而,当我认为应该返回记录时,我得到了一个空白记录集 我肯定我做错了什么事,这让我很恼火 背景/设置 我有一个Oracle 11g数据库,用于IBM的一个名为Maximo的产品 该产品有一个名为workorder的表,其中列出了workorder;该表有一个名为wonum的字段,表示唯一的工作订单号。 我有一个报告用户,可以通过maximo模式访问表 e、 g.从maximo.workorder中选择* 我正在使用Oracle的托管ODP.NET DLL来完成数据任务,并且是第一次使用它。 我尝试过的事情 我创建了一个基本的控制台应用程序来测试这一点 我在主分支上添加了NHibernate.Driver.cs中的OracleManagedClientDriver.cs,我正在使用的版本中没有正式的版本。 我创建了一个名为WorkorderBriefBrief的POCO,它只有一个WorkorderNumber字段。 我创建了一个类映射WorkorderBriefBriefMap,它只将该值映射为只读值。 我创建了一个带有控制台输出的控制台应用程序,试图写入工作单行。 会话和事务似乎打开正确, 我测试了连接字符串的标准ODP.NET OracleConnection 代码 POCO:WorkorderBriefBrief.cs 映射:WorkorderBriefBriefMap.csLinq NHib 3配置和映射是否返回空结果?,linq,oracle,nhibernate,odp.net,nhibernate-3,Linq,Oracle,Nhibernate,Odp.net,Nhibernate 3,注意:我不是特别使用Fluent NHibernate,而是使用3.x的内置映射样式。然而,当我认为应该返回记录时,我得到了一个空白记录集 我肯定我做错了什么事,这让我很恼火 背景/设置 我有一个Oracle 11g数据库,用于IBM的一个名为Maximo的产品 该产品有一个名为workorder的表,其中列出了workorder;该表有一个名为wonum的字段,表示唯一的工作订单号。 我有一个报告用户,可以通过maximo模式访问表 e、 g.从maximo.workorder中选择* 我正在
在配置NHibernate时,您需要告诉它您的映射。我找到了答案-多亏了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();
为NHibernate.SQL记录器启用调试日志记录,并查看实际使用的SQL。嗨,奥斯卡。我已经启用了db.logdqlincole,并更新了上面的代码示例。这就是你说的吗?噢!谢谢更新了代码。快速提问:您看到类映射不执行的原因了吗?使用NHProf尝试诊断并添加程序集时,我看到警告:在程序集中找不到映射文档,但WorkorderBriefBriefMap继承自ClassMap。这不对吗?
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");
});
}
}
}
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();
}
}
}
}
// 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();
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();