使用 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 签名。