使用session.QueryOver<>在Fluent-NHibernate中搜索回来空了

时间:2015-06-15 09:12:42

标签: c# fluent-nhibernate fluent-nhibernate-mapping

嘿大家我是ORM的新手,我在我的CRUD中使用Fluent NHibernate似乎在我的搜索中有问题,它会返回一个空值或空值,我也可以插入数据,但当我插入另一条记录时,它似乎更新bcoz它取代了我之前的记录。我尝试做一些谷歌但仍然没有使用。任何人都可以给我一些教程链接。

我的代码:

objclass文件夹中的employee 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..
     }
  }

地图类文件夹中的我的映射类

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

    }
  }

最后我的表

 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

:(对不起我糟糕的英语和对齐方式:(提前致谢

2 个答案:

答案 0 :(得分:1)

My Error位于

中的NHibernateHelper.cs中
     ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true); 

每次运行并执行它都将删除当前表并重新创建这就是为什么我的搜索返回为空并且每次添加新条目时我的添加都会替换

我的正确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();
    }
  }

}

答案 1 :(得分:0)

乍一看,我实际上注意到您的代码存在两个可能的问题。

<强>首先

您是否尝试过分析生成的SQL?使用像NHProf这样的填充工具。

修改

如果您通过添加以下内容扩展FluentConfiguration设置,则可以选择另一种日志记录:

.Diagnostics(d => d.Enable(true))
.Diagnostics(d => d.OutputToConsole())

第一行启用条件记录时,第二行将诊断记录设置为控制台。

那么你真的可以看到背景中发生了什么,因为我怀疑它实际上取代了你现有的记录。

因为您正在调用<{1}}方法

  

保留给定的瞬态实例

但是你说它被“替换”了,这相当于调用Save()方法

  

Save()或Update()给定实例,具体取决于值   其标识符属性。

<强>第二

每次实例化SaveOrUpdate()助手时,是否需要创建整个数据库架构?

因为您使用NHibernate调用ExposeConfiguration()方法。

SchemaExport.Create(true, true)

  

运行架构创建脚本

通过将第二个布尔参数传递给SchemaExport.Create(...),您实际上是在告诉您执行模式的创建。

简而言之,这意味着它将在每次运行时删除并重新创建表。

因此,如果您要连接到现有架构,则可以注释掉Create()调用,除非您使用此内存sql server。

希望它有所帮助!

P.s。:引自Fluent Nhibernates XMLdoc签名。