使用 session.QueryOver<> return 空在 Fluent-NHibernate 中搜索
Search in Fluent-NHibernate using session.QueryOver<> return empty
大家好我是 ORM 的新手,我在我的 CRUD 中使用 Fluent NHibernate 似乎在我的搜索中有问题,它将 return 一个空值或 null 值并且我也可以插入数据,但是当我插入另一条记录,它似乎在更新,因为它取代了我以前的记录。我试着做了一些 google 但还是没用。谁能给我一些教程链接。
我的代码:
objclass 文件夹中的员工 Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace fluent.objclass
{
public class employees
{
public virtual int employee_id { get; set; }
public virtual string employee_code { get; set; }
public virtual string last_name { get; set; }
public virtual string first_name { get; set; }
public virtual string middle_initial { get; set; }
ect..
}
}
我的地图 Class 在地图 class 文件夹中
using fluent.objclass;
using FluentNHibernate.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace fluent.mapclass
{
public class employeesMap: ClassMap<employees>
{
public employeesMap()
{
Id(x => x.employee_id);
Map(x => x.employee_code);
Map(x => x.last_name);
Map(x => x.first_name);
Map(x => x.middle_initial);
ect..
}
}
}
存储库文件夹中的我的存储库
using fluent.objclass;
using NHibernate;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace fluent.repository
{
public class emp_repository
{
public void INSERT(employees newEmp)
{
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(newEmp);
transaction.Commit();
}
}
}
public employees GetemployeesbyLName(int input)
{
using (ISession session = NHibernateHelper.OpenSession())
{
var result = session.QueryOver<employees>().Where(x => x.employee_id == input).SingleOrDefault();
return result ?? new employees();
}
}
}
}
我的 NHibernateHelper
using fluent.objclass;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace fluent
{
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
InitializeSessionFactory();
return _sessionFactory;
}
}
private static void InitializeSessionFactory()
{
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(@"Server=ARK\DARKAGE;Database=PNH;Trusted_Connection=True;")
.ShowSql()
)
.Mappings(m =>
m.FluentMappings
.AddFromAssemblyOf<employees>())
.ExposeConfiguration(cfg => new SchemaExport(cfg)
.Create(true, true))
.BuildSessionFactory();
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
}
我的代码狙击
using FluentNHibernate.Mapping;
using fluent.objclass;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NHibernate.Linq;
using fluent.repository;
namespace fluent
{
public partial class fluent : Form
{
emp_repository repo = new emp_repository();
public fluent()
{
InitializeComponent();
}
private void bntADD_Click(object sender, EventArgs e)
{
var emp = new employees
{
employee_code = txtBAR.Text.Trim(' '),
last_name = txtLNM.Text.Trim(' '),
first_name = txtFNM.Text.Trim(' '),
middle_initial = txtMNM.Text.Trim(' '),
ect...
};
repo.INSERT(emp);
MessageBox.Show(txtLNM.Text.Trim(' ') + "Successfully Added To Record");
}
private void bntSE_Click(object sender, EventArgs e)
{
employees emp = repo.GetemployeesbyLName(1);
MessageBox.Show(emp.last_name);
}
}
}
终于是我的 Table
USE [PNH]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[employees](
[employee_id] [int] IDENTITY(1,1) NOT NULL,
[employee_code] [nvarchar](255) NULL,
[last_name] [nvarchar](255) NULL,
[first_name] [nvarchar](255) NULL,
[middle_initial] [nvarchar](255) NULL,
ect...
PRIMARY KEY CLUSTERED
(
[employee_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
:(抱歉我的英语和对齐方式不好:(提前致谢
我的错误在 NHibernateHelper.cs 中
ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true);
每次我 运行 并执行它都会删除当前的 table 并重新创建这就是为什么我的搜索 returns 为空并且每次我添加新条目时我的添加都会替换
我的正确NHibernateHelper.cs
using fluent.objclass;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace fluent
{
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static readonly object factorylock = new object();
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
InitializeSessionFactory();
return _sessionFactory;
}
}
private static void InitializeSessionFactory()
{
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(@"Server=ARK\DARKAGE;Database=PNH;Trusted_Connection=True;").ShowSql()
)
.Mappings(m =>
m.FluentMappings
.AddFromAssembly(Assembly.GetExecutingAssembly()))
.BuildSessionFactory();
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
}
乍一看,我注意到您的代码可能存在两个问题。
第一个:
您是否尝试分析生成的 SQL?使用像 NHProf 这样的分析器工具。
编辑:
如果您通过添加以下内容来扩展 FluentConfiguration
设置,则可以使用另一个记录选项:
.Diagnostics(d => d.Enable(true))
.Diagnostics(d => d.OutputToConsole())
第一行启用条件日志记录,第二行将诊断日志记录设置为控制台。
这样你就可以真正看到后台发生了什么,因为我怀疑它是否真的取代了你现有的记录。
由于您正在调用 Save()
方法
Persists the given transient instance
但是你说它得到 "replaced",这相当于调用 SaveOrUpdate()
方法 which
Either Save() or Update() the given instance, depending upon the value
of its identifier property.
第二个:
每次实例化 NHibernate
帮助器时都需要创建整个数据库模式吗?
因为您正在使用 SchemaExport.Create(true, true)
调用 ExposeConfiguration()
方法。
哪里SchemaExport.Create(...)
Runs the schema creation script
通过将第二个布尔参数传递给 Create()
,您实际上是在告诉执行模式的创建。
简而言之,这意味着它将在每个 运行 上删除并重新创建表。
因此,如果您要连接到已经存在的架构,则可以注释掉 SchemaExport
调用,除非您正在使用它,例如内存 sql 服务器。
希望对您有所帮助!
P.s.: 引自 Fluent Nhibernates XMLdoc 签名。
大家好我是 ORM 的新手,我在我的 CRUD 中使用 Fluent NHibernate 似乎在我的搜索中有问题,它将 return 一个空值或 null 值并且我也可以插入数据,但是当我插入另一条记录,它似乎在更新,因为它取代了我以前的记录。我试着做了一些 google 但还是没用。谁能给我一些教程链接。
我的代码:
objclass 文件夹中的员工 Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace fluent.objclass
{
public class employees
{
public virtual int employee_id { get; set; }
public virtual string employee_code { get; set; }
public virtual string last_name { get; set; }
public virtual string first_name { get; set; }
public virtual string middle_initial { get; set; }
ect..
}
}
我的地图 Class 在地图 class 文件夹中
using fluent.objclass;
using FluentNHibernate.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace fluent.mapclass
{
public class employeesMap: ClassMap<employees>
{
public employeesMap()
{
Id(x => x.employee_id);
Map(x => x.employee_code);
Map(x => x.last_name);
Map(x => x.first_name);
Map(x => x.middle_initial);
ect..
}
}
}
存储库文件夹中的我的存储库
using fluent.objclass;
using NHibernate;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace fluent.repository
{
public class emp_repository
{
public void INSERT(employees newEmp)
{
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(newEmp);
transaction.Commit();
}
}
}
public employees GetemployeesbyLName(int input)
{
using (ISession session = NHibernateHelper.OpenSession())
{
var result = session.QueryOver<employees>().Where(x => x.employee_id == input).SingleOrDefault();
return result ?? new employees();
}
}
}
}
我的 NHibernateHelper
using fluent.objclass;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace fluent
{
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
InitializeSessionFactory();
return _sessionFactory;
}
}
private static void InitializeSessionFactory()
{
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(@"Server=ARK\DARKAGE;Database=PNH;Trusted_Connection=True;")
.ShowSql()
)
.Mappings(m =>
m.FluentMappings
.AddFromAssemblyOf<employees>())
.ExposeConfiguration(cfg => new SchemaExport(cfg)
.Create(true, true))
.BuildSessionFactory();
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
}
我的代码狙击
using FluentNHibernate.Mapping;
using fluent.objclass;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NHibernate.Linq;
using fluent.repository;
namespace fluent
{
public partial class fluent : Form
{
emp_repository repo = new emp_repository();
public fluent()
{
InitializeComponent();
}
private void bntADD_Click(object sender, EventArgs e)
{
var emp = new employees
{
employee_code = txtBAR.Text.Trim(' '),
last_name = txtLNM.Text.Trim(' '),
first_name = txtFNM.Text.Trim(' '),
middle_initial = txtMNM.Text.Trim(' '),
ect...
};
repo.INSERT(emp);
MessageBox.Show(txtLNM.Text.Trim(' ') + "Successfully Added To Record");
}
private void bntSE_Click(object sender, EventArgs e)
{
employees emp = repo.GetemployeesbyLName(1);
MessageBox.Show(emp.last_name);
}
}
}
终于是我的 Table
USE [PNH]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[employees](
[employee_id] [int] IDENTITY(1,1) NOT NULL,
[employee_code] [nvarchar](255) NULL,
[last_name] [nvarchar](255) NULL,
[first_name] [nvarchar](255) NULL,
[middle_initial] [nvarchar](255) NULL,
ect...
PRIMARY KEY CLUSTERED
(
[employee_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
:(抱歉我的英语和对齐方式不好:(提前致谢
我的错误在 NHibernateHelper.cs 中
ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true);
每次我 运行 并执行它都会删除当前的 table 并重新创建这就是为什么我的搜索 returns 为空并且每次我添加新条目时我的添加都会替换
我的正确NHibernateHelper.cs
using fluent.objclass;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace fluent
{
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static readonly object factorylock = new object();
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
InitializeSessionFactory();
return _sessionFactory;
}
}
private static void InitializeSessionFactory()
{
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(@"Server=ARK\DARKAGE;Database=PNH;Trusted_Connection=True;").ShowSql()
)
.Mappings(m =>
m.FluentMappings
.AddFromAssembly(Assembly.GetExecutingAssembly()))
.BuildSessionFactory();
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
}
乍一看,我注意到您的代码可能存在两个问题。
第一个:
您是否尝试分析生成的 SQL?使用像 NHProf 这样的分析器工具。
编辑:
如果您通过添加以下内容来扩展 FluentConfiguration
设置,则可以使用另一个记录选项:
.Diagnostics(d => d.Enable(true))
.Diagnostics(d => d.OutputToConsole())
第一行启用条件日志记录,第二行将诊断日志记录设置为控制台。
这样你就可以真正看到后台发生了什么,因为我怀疑它是否真的取代了你现有的记录。
由于您正在调用 Save()
方法
Persists the given transient instance
但是你说它得到 "replaced",这相当于调用 SaveOrUpdate()
方法 which
Either Save() or Update() the given instance, depending upon the value of its identifier property.
第二个:
每次实例化 NHibernate
帮助器时都需要创建整个数据库模式吗?
因为您正在使用 SchemaExport.Create(true, true)
调用 ExposeConfiguration()
方法。
哪里SchemaExport.Create(...)
Runs the schema creation script
通过将第二个布尔参数传递给 Create()
,您实际上是在告诉执行模式的创建。
简而言之,这意味着它将在每个 运行 上删除并重新创建表。
因此,如果您要连接到已经存在的架构,则可以注释掉 SchemaExport
调用,除非您正在使用它,例如内存 sql 服务器。
希望对您有所帮助!
P.s.: 引自 Fluent Nhibernates XMLdoc 签名。