2015-06-15 6 views
0

Привет всем Я новичок в ORM, я использую Fluent NHibernate в своем CRUD, похоже, проблема в моем поиске, он вернет пустое или нулевое значение, а также Я могу вставлять данные, но когда я вставляю другую запись, кажется, что она обновляет bcoz, она заменяет мою предыдущую запись. Я пытаюсь сделать некоторые Google, но все равно не используется. Может ли кто-нибудь дать мне некоторые учебные ссылки.Поиск в Fluent-NHibernate с использованием session.QueryOver <> return empty

Мой код:

сотрудник класса в objclass папке

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.. 
    } 
    } 

My Mapping класс в карте папку класса

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 

:(простите за мой плохой английский и выравнивание :(Заранее спасибо

ответ

0

С первого взгляда я заметил две возможные проблемы с вашим кодом.

Первое:

Вы пробовали профилировать сгенерированный SQL? С помощью профайлера, такого как NHProf.

Edit:

Другой вариант для регистрации может быть, если вы расширяете установку FluentConfiguration, добавив:

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

Где, как первая линия позволяет условно протоколирование, то вторая строка устанавливает журнал для диагностики утешить.

Итак, вы действительно можете увидеть, что происходит в фоновом режиме, поскольку я сомневаюсь, что он фактически заменил вашу существующую запись.

Поскольку вы вызываете Save() метод, который

упорствует данный переходный экземпляр

Однако вы о том, что он получает «заменить», которая была бы эквивалентна называть SaveOrUpdate() метод, который

Либо Save(), либо Update() данный экземпляр, в зависимости от значения его идентификатор.

Второе:

вам нужно создать всю схему базы данных каждый раз, когда вы создать экземпляр NHibernate помощник делать?

Потому что вы вызываете метод ExposeConfiguration() с SchemaExport.Create(true, true).

Где SchemaExport.Create(...)

Запускает сценарий создания схемы

Пропустив второй булево значение для Create(), вы на самом деле говорит, чтобы выполнить создание схемы.

Короче говоря, это означает, что он будет падать и воссоздавать таблицы на каждом прогоне.

Так что если вы подключаетесь к уже существующей схеме, вы можете прокомментировать вызов SchemaExport, если вы не используете это, например, в sql-сервере в памяти.

Надеюсь, это поможет!

P.s .: цитаты, взятые из подписи Fluent Nhibernates XMLdoc.

+0

Спасибо, что посмотрели мое сообщение, и спасибо за предложение. Я пропустил эту часть. Метод ExposeConfiguration() каждый раз, когда я его выполняю, он будет падать и воссоздавать таблицы. То почему я изменяю его к .AddFromAssembly (Assembly.GetExecutingAssembly())) –

+0

Мое удовольствие. Помогла ли вам решить проблему? – kayess

+0

На самом деле я уже давно решил свою проблему и отправлю свой ответ здесь. ниже - мой отредактированный NHibernateHelper, но я не могу попробовать NHProf или протоколировать. Спасибо: D –

1

Моя ошибка находится в 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(); 
    } 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^