0

샘플에 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에. Exceptions.GenericADOException : 이전 수 없습니다. ecute query [this_.ID를 ID1_1_, this_.name을 name1_1_,이 _.lastname을 lastname1_1_, tblterm1_.ID를 ID2_0_, tblterm1_.LessonID를 LessonID2_0_, tblterm1_.StudentID를 StudentID2_0_에서 TblStudent에서 this_ 내부를 TblTerm tblterm1_에 연결하십시오. ID = tblterm1_.TblStudent_id] [SQL : this_.name을 (를) ID1_1_로 선택하고 this_.name을 name1_1_, this_.lastname을 lastname1_1_, tblterm1_.ID를 ID2_0_, tblterm1_.LessonID를 LessonID2_0_, tblterm1_.StudentID를 StudentID2_0_에서 TblStudent this_ inner TblTerm tblterm1_ this_.ID = tblterm1_.TblStudent_id]에 가입 ---> System.Data.SqlClient.SqlException : 잘못된 열 이름 'TblStudent_id'. System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning에서 System.Data.SqlClient.SqlInternalConnection.OnError에서 System.Data.SqlClient.SqlConnection.OnError (SQLEXCEPTION 예외 부울 breakConnection) (SQLEXCEPTION 예외 부울 breakConnection) (AT ) System.Data.SqlClient.SqlDataReader.get_MetaData에서 System.Data.SqlClient.SqlDataReader.ConsumeMetaData()에서 System.Data.SqlClient.TdsParser.Run (runBehavior runBehavior, SqlCommand를 cmdHandler, SqlDataReader의 데이터 스트림, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)에서 () 에서 System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (Comm andBehavior System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String 메서드, DbAsyncResult 결과)에서 에있는 System.Data.SqlClient.SqlCommand.RunExecuteReader에서 의 RunBehavior, RunBehavior runBehavior, 부울 비동기 (CommandBehavior를 cmdBehavior, RunBehavior runBehavior, 부울 returnStream, 문자열 방식) 시스템에서 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader에서 System.Data.SqlClient.SqlCommand.ExecuteReader에서 (CommandBehavior를 행동, 문자열 방법) (CommandBehavior를 동작) . d : \ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ AdoNet \ AbstractBatcher.cs의 NHibernate.AdoNet.AbstractBatcher.ExecuteReader (IDbCommand cmd)에서의 Data.Common.DbCommand.System.Data.IDbCommand.System.Data.IDbCommand.ExecuteReader() : 247 번 라인Hibernate \ Loader \ Loader.cs : NHibernate.Loader.Loader.GetResultSet (IDbCommand st, 부울 autoDiscoverTypes, 부울 호출 가능, RowSelection 선택, ISessionImplementor 세션)에서: 줄 1349 NHibernate.Loader.DoQuery (ISessionImplementor 세션, QueryParameters queryParameters, 부울 returnProxies)에서 d : \ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Loader \ Loader.cs : 행 413 at NHibernate.Loader.Loader. DHibernate.Loader.Loader.DoList에서 243 줄에있는 DoQueryAndInitializeNonLazyCollections (ISessionImplementor 세션, QueryParameters queryParameters, 부울 returnProxies) : \ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Loader \ Loader.cs의 라인 (ISessionImplementor 세션, QueryParameters queryParameters) in d : \ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Loader \ Loader.cs : 줄 1694 --- 끝내기 예외 스택 추적 끝 --- at NHibernate.Loader.Loader.DHibernate.Loader.Loader.ListIgnoreQueryCache (ISessionImplementor 세션, QueryParameters queryParameters)에서 d : \ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Loader \ Loader.cs의 DoList (ISessionImplementor 세션, QueryParameters queryParameters) : 라인 1703 : \ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Loader \ Loader.cs : NHibernate.Loader.Loader.List에있는 라인 1601 (ISessionImplementor 세션, QueryParameters queryParameters, ISet 1 querySpaces, IType[] resultTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1595 at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Criteria\CriteriaLoader.cs:line 74 at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 1919 at NHibernate.Impl.CriteriaImpl.List(IList results) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\CriteriaImpl.cs:line 265 at NHibernate.Impl.CriteriaImpl.List[T]() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\CriteriaImpl.cs:line 276 at NHibernate.Impl.CriteriaImpl.Subcriteria.List[T]() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\CriteriaImpl.cs:line 813 at NHibernate.Criterion.QueryOver d : \ CSharp의 1.List() \ NH \ NH \ nhibernate \ src \ NHibernate \ Criterion \ QueryOver.cs : 라인 57 at NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver.List() d : \ CSharp \ NH \ NH \ nhibernate \ src \ Hibernate \ Criterion \ QueryOver.cs : line 198 at human.Form1.button_JoinSelect_Click (Object sender, EventArgs e) E : \ desktop \ Human \ human \ human \ Form1.cs의 라인 84

제발 알려주십시오

+0

전체 예외 텍스트는 무엇입니까? – brainboost

+0

는 쿼리를 실행할 수 없습니다. [this_.ID를 ID1_1_로 선택하고 this_.name을 name1_1_, last_1_1_1_1_1_1__tblterm1_.ID로 ID2_0_, tblterm1_.LessonID를 LessonID2_0_, tblterm1_.StudentID로 StudentID2_0_ FROM TblStudent FRAME TblStudent this_ 내부 조인 TblTerm tblterm1_을 this_.ID = tblterm1_.TblStudent_id] [SQL : this_.name을 ID1_1_, this_.name을 name1_1_, this_.lastname을 lastname1_1_, tblterm1_.ID를 ID2_0_, tblterm1_.LessonID를 LessonID2_0_, tblterm1_.StudentID를 StudentID2_0_에서 TblStudent this_ 내부 조인 TblTerm tblterm1_ on this_.ID = tblterm1_.TblStudent_id] – Mohsen

+0

전체 brainboost와 함께 'exception.ToString()'예외가 아니라. 메시지. – Firo

답변

0

그 예외는 여러 가지 이유로 발생할 수 있습니다. 예를 들어, 테이블을 사용하지 않고 db를 통해 코드를 실행하려고 할 때 동일한 오류가 발생했습니다. 테이블에서 하나의 레코드가 잘 반환되는지 확인한 다음 조인 작업을 시도하십시오. 아무런 오류도 보이지 않습니다. nh를 올바르게 구성했는데 예외가 발생하지 않았습니다. 팩토리 초기화 대신 새로운 코드를 시도해보십시오. 실제 테이블이 동일한 지 확인하기 위해 매핑의 테이블을 만듭니다.

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