2011-10-25 3 views
2

에서 기본적인 관계 문제 예제를 찾을 수 없습니다. 나는 Fluent NHibernate에 대한 기본적인 이해를 얻으려고 노력하고있다. 그러나 리소스는 적절한 튜토리얼 측면에서 아주 드물게 보인다. 이 같은 다른 클래스로Fluent NHibernate C#

public class User 
{ 
    public virtual long ID { get; set; } 
    public virtual string Username { get; set; } 
    public virtual MoreDetails ExtendedDetails { get; set; }  
} 

:

는이 같은 테스트 클래스가

public class MoreDetails 
{ 
    public virtual long ID { get; set; } 
    public virtual string Firstname { get; set; } 
    public virtual long UserID { get; set; } // Foreign key in the DB 
} 

내 매핑을 똑같이 중요시하는 점은 무엇 하는가?

나는이 작업을 수행 할 수 있도록 게으른 또는 열망 로딩 중 하나와 제대로 DB를 조회 할 수 있습니다 방법 :

// user object instantiated using your provided example: 
userObject.ExtendedDetails.Firstname 

나는 일반적으로 내가 문서 그러나 이런 종류의와 매우 모호한을 따를 수 있습니다 .. 바보 같은 느낌 사용법. 누구든지 적절한 예를 가르쳐 줄 수 있습니까?

Fluent NHibernate 웹 사이트에서 직접 최신 NHibernate를 사용하고 있습니다.

감사합니다,

화학

답변

2

이 여기에 당신이 일어나서 실행하는 데 도움이 수를 통해 좋은 도보 거리에 일대일 매핑에 대한 자세한 내용은 http://wiki.fluentnhibernate.org/Fluent_mapping를 참조하십시오. 이 엔티티들 간의 매핑 유형과 함께 ID를 생성하는 방법에 대해 몇 가지 가정을하고 있습니다.

관계형 데이터를 쿼리하려면 nhibernate 내에서 세션을 열어야합니다. 나는 일반적으로 이것의 라인을 따라 도우미를 만든다. 나는이 밖으로 많이 떠날거야 것을

public IQueryable<User> Users 
     { 
      get { return NHibernateHelper.OpenSession().Query<User>(); } 
     } 

참고 그러나 희망이 점점 실행에 도움을 줄 것입니다 :

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.MsSql2008 
           .ConnectionString(@"Server=localhost\SQLExpress;Database=SomeDB;Trusted_Connection=True;") 
           .ShowSql() 
       ) 
       .Mappings(m => m.FluentMappings.AddFromAssemblyOf<User>()) 
       .BuildSessionFactory(); 
     } 

     public static ISession OpenSession() 
     { 
      return SessionFactory.OpenSession(); 
     } 
    } 

거기에서 직접 다음과 같이 조회 할 수있다.

+0

이것은 사용자로드에 적합하지만 userObject.ExtendedDetails.Firstname을 시도 할 때 여전히 NullReference 예외가 발생합니다. User 클래스의 ExtendedDetails 멤버를 매핑 할 필요가 없습니까? – chemicalNova

+0

@chemicalNova 죄송합니다. UserMapping() 클래스의 일부를 복사하지 못했습니다. 업데이트 된 답변. – Jesse

+0

고마워요! 이것은 정말 도움이 :) – chemicalNova

0

당신의 DB는 정말 당신이 당신의 ClassMap 예에 hasOne의를 사용할 필요가 두 테이블 사이에 일대일 매핑이없는 경우 http://dotnetslackers.com/articles/ado_net/Your-very-first-NHibernate-application-Part-1.aspx

당신의 매핑은 다음과 같이 보일 것입니다 : HasOne(x => x.ExtendedDetails)

+0

나중에 어떻게 사용하나요? 따라서 사용자는 HasOne 맵을 가져야합니다. MoreDetails에는 필요한 것이 있습니까?(), References()?) 내가 ExtendedDetails에서 여전히 NullReferenceException을 얻고 있기 때문에 내가 묻는 이유입니다. 만약 사용자 클래스에 HasOne()이 필요한 것이면 .. NHibernate가 관계형 데이터를로드하게하는 방법은 무엇입니까? – chemicalNova