объединение 2 таблиц с помощью запроса

#nhibernate #fluent-nhibernate #nhibernate-mapping #fluent-nhibernate-mapping

#nhibernate #свободно-nhibernate #nhibernate-сопоставление #fluent-nhibernate-сопоставление

Вопрос:

У меня есть 3 таблицы в образце. я собираюсь объединить 2 таблицы, но у меня проблема: ниже приведен мой код :

 <?xml version="1.0"?>
  

 </configSections>

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Server=(local);database=human;Integrated Security=SSPI;</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>
  

 using System.Collections.Generic; 
using System.Text; 
using System; 


namespace human {

public class TblStudent {
    public TblStudent() { }
    public virtual int ID { get; set; }
    public virtual IList<TblTerm> TblTerms { get; set; }
    public virtual string name { get; set; }
    public virtual string lastname { get; set; }
}
}


using System; 
using System.Collections.Generic; 
using System.Text; 
using FluentNHibernate.Mapping;

namespace human {


public class TblStudentMap : ClassMap<TblStudent> {

    public TblStudentMap() {
        Table("TblStudent");
        LazyLoad();
        Id(x => x.ID).GeneratedBy.Identity().Column("ID");
        Map(x => x.name).Column("name");
        Map(x => x.lastname).Column("lastname");
        HasMany(x => x.TblTerms);
    }
}
}

using System.Collections.Generic; 
using System.Text; 
using System; 


namespace human {

public class TblTerm {
    public TblTerm() { }
    public virtual int ID { get; set; }
    public virtual TblLesson TblLesson { get; set; }
    public virtual TblStudent TblStudent { get; set; }
}
}

using System; 
using System.Collections.Generic; 
using System.Text; 
using FluentNHibernate.Mapping;

namespace human {


public class TblTermMap : ClassMap<TblTerm> {

    public TblTermMap() {
        Table("TblTerm");
        LazyLoad();
        Id(x => x.ID).GeneratedBy.Identity().Column("ID");
        References(x => x.TblLesson).Column("LessonID");
        References(x => x.TblStudent).Column("StudentID");
    }
}
}

using System; 
using System.Collections.Generic; 
using System.Text; 
using FluentNHibernate.Mapping;

namespace human {


public class TblTermMap : ClassMap<TblTerm> {

    public TblTermMap() {
        Table("TblTerm");
        LazyLoad();
        Id(x => x.ID).GeneratedBy.Identity().Column("ID");
        References(x => x.TblLesson).Column("LessonID");
        References(x => x.TblStudent).Column("StudentID");
    }
}
}

 private void button_JoinSelect_Click(object sender, EventArgs e)
    {
        var cfg = new Configuration();
        PersistenceModel pm = new PersistenceModel();
        pm.AddMappingsFromAssembly(typeof(human.TblStudent).Assembly);
        pm.Configure(cfg);
        ISessionFactory factory = cfg.BuildSessionFactory();

        using (var session = factory.OpenSession())
        {
            using (var trans = session.BeginTransaction())
            {
                var query = session.QueryOver<TblStudent().JoinQueryOver<TblTerm>
      (c=> c.TblTerms).List();
                trans.Commit();
                dataGridView1.DataSource = query;
            }
        }
      }
  

Моя ошибка :

NHibernate.Исключения.GenericADOException: не удалось выполнить запрос [ВЫБЕРИТЕ это_.Идентификатор как ID1_1_, this_.name как name1_1_, это_.фамилия как lastname1_1_, tblterm1_.Идентификатор как ID2_0_, tblterm1_.LessonID как LessonID2_0_, tblterm1_.StudentID как StudentID2_0_ ИЗ TblStudent это_ внутреннее соединение TblTerm tblterm1_ на this_.ID=tblterm1_.TblStudent_id ] [SQL: ВЫБЕРИТЕ это_.Идентификатор как ID1_1_, this_.name как name1_1_, это_.фамилия как lastname1_1_, tblterm1_.Идентификатор как ID2_0_, tblterm1_.LessonID как LessonID2_0_, tblterm1_.StudentID как StudentID2_0_ ИЗ TblStudent это_ внутреннее соединение TblTerm tblterm1_ на this_.ID=tblterm1_.TblStudent_id] —> System.Data.SqlClient.SQLException: недопустимое имя столбца ‘TblStudent_id’. в System.Data.SqlClient.SqlConnection.Ошибка onError(исключение SQLException, логическое прерывание соединения) в System.Data.SqlClient.SqlInternalConnection.Ошибка onError(исключение SQLException, логическое прерывание соединения) в System.Data.SqlClient.TdsParser.Throw exceptionandwarning() в System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) в системе.Data.SqlClient.SqlDataReader.ConsumeMetaData() в System.Data.SqlClient.SqlDataReader.get_MetaData() в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, строка resetOptionsString) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический поток возврата, логическая асинхронность) в System.Data.SqlClient.SqlCommand.RunExecuteReader( CommandBehavior cmdBehavior, RunBehavior runBehavior, Логический поток возврата, Строковый метод, DbAsyncResult результат)в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический поток возврата, строковый метод) в System.Data.SqlClient.SqlCommand.ExecuteReader(поведение CommandBehavior, строковый метод) в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(поведение CommandBehavior) в System.Data.Обычный.DbCommand.System.Data.IDbCommand.ExecuteReader() в NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) в d:CSharpNHNHnhibernatesrcNHibernateAdoNetAbstractBatcher.cs:line 247 в NHibernate.Загрузчик.Загрузчик.getResultSet(IDbCommand st, логические типы автоматического обнаружения, логический вызываемый, выбор выбора строк, ISessionImplementor session) в d:CSharpNHNHnhibernatesrcNHibernateLoaderLoader.cs:line 1349 год в NHibernate.Загрузчик.Загрузчик.Выполнение запроса (ISessionImplementor session, параметры запроса queryParameters, логические запросы возврата) в d:CSharpNHNHnhibernatesrcNHibernateLoaderLoader.cs:line 413 в NHibernate.Загрузчик.Загрузчик.Выполняйте запросы и инициализируйте неязыковые коллекции (ISessionImplementor session, параметры запроса, параметры запроса, логические запросы возврата) в d:CSharpNHNHnhibernatesrcNHibernateLoaderLoader.cs:line 243 в NHibernate.Загрузчик.Загрузчик.ДоЛист(ISessionImplementor session, параметры запроса queryParameters) в d:CSharpNHNHnhibernatesrcNHibernateLoaderLoader.cs:line 1694 — Конец внутренней трассировки стека исключений — в NHibernate.Загрузчик.Загрузчик.ДоЛист(ISessionImplementor session, параметры запроса queryParameters) в d:CSharpNHNHnhibernatesrcNHibernateLoaderLoader.cs:line 1703 год в NHibernate.Загрузчик.Загрузчик.ListIgnoreQueryCache(ISessionImplementor session, параметры запроса queryParameters) в d:CSharpNHNHnhibernatesrcNHibernateLoaderLoader.cs:line 1601 год в NHibernate.Загрузчик.Загрузчик.Список(ISessionImplementor session, параметры запроса queryParameters, iset1 1 querySpaces, IType[] resultTypes) in d:CSharpNHNHnhibernatesrcNHibernateLoaderLoader.cs:line 1595
at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session) in d:CSharpNHNHnhibernatesrcNHibernateLoaderCriteriaCriteriaLoader.cs:line 74
at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) in d:CSharpNHNHnhibernatesrcNHibernateImplSessionImpl.cs:line 1919
at NHibernate.Impl.CriteriaImpl.List(IList results) in d:CSharpNHNHnhibernatesrcNHibernateImplCriteriaImpl.cs:line 265
at NHibernate.Impl.CriteriaImpl.List[T]() in d:CSharpNHNHnhibernatesrcNHibernateImplCriteriaImpl.cs:line 276
at NHibernate.Impl.CriteriaImpl.Subcriteria.List[T]() in d:CSharpNHNHnhibernatesrcNHibernateImplCriteriaImpl.cs:line 813
at NHibernate.Criterion.QueryOver
.List() в d:CSharpNHNHnhibernatesrcNHibernateCriterionQueryOver.cs:line 57 в NHibernate.Критерий.QueryOver`1.NHibernate.IQueryOver.List() в d:CSharpNHNHnhibernatesrcNHibernateCriterionQueryOver.cs:line 198 у человека.Form1.button_JoinSelect_Click(отправитель объекта, EventArgs e) в E:desktopHumanhumanhumanForm1.cs:line 84

Пожалуйста, посоветуйте мне

Комментарии:

1. каков полный текст исключения?

2. не удалось выполнить запрос [ВЫБЕРИТЕ это_. Идентификатор как ID1_1_, this_.name как name1_1_, это_. фамилия как lastname1_1_, tblterm1_. Идентификатор как ID2_0_, tblterm1_. LessonID как LessonID2_0_, tblterm1_. StudentID как StudentID2_0_ ИЗ TblStudent это_ внутреннее соединение TblTerm tblterm1_ на this_. ID=tblterm1_. TblStudent_id ] [SQL: ВЫБЕРИТЕ это_. Идентификатор как ID1_1_, this_.name как name1_1_, это_. фамилия как lastname1_1_, tblterm1_. Идентификатор как ID2_0_, tblterm1_. LessonID как LessonID2_0_, tblterm1_. StudentID как StudentID2_0_ ИЗ TblStudent это_ внутреннее соединение TblTerm tblterm1_ на this_. ID=tblterm1_. TblStudent_id]

3. с полным brainboost означало exception.ToString() , что нет exception.Message

Ответ №1:

Это исключение может быть результатом многих причин. Например, у меня такая же ошибка, когда я просто пытаюсь запустить ваш код через мою базу данных без ваших таблиц вообще. Попробуйте проверить, правильно ли вернулась какая-либо запись из любой вашей таблицы, а затем попытайтесь заставить ваше соединение работать. Я не вижу ошибки, когда я правильно настроил nh, никаких исключений не было. Попробуйте этот код вместо вашей заводской инициализации (в новой свежей базе данных), он создает таблицы из ваших сопоставлений, чтобы увидеть, совпадают ли ваши реальные таблицы.

 ISessionFactory factory = Fluently.Configure()
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TblStudent>())
            .ExposeConfiguration(config => new SchemaExport(config).Create(false, true));