2014-03-07 1 views
2

nhibernate가 사용중인 사이트를 개발 중입니다. 그것은 정적 매핑을 위해 잘 작동합니다. 하지만 문제는 내가 기존의 데이터베이스 에이 응용 프로그램을 적용합니다. 그래서 런타임에 클래스의 매핑이 일어난다. 나는 사용자가 매핑을 위해 테이블과 컬럼 이름을 제공한다는 것을 의미한다. 감사합니다런타임시 Nhibernate 매핑

+0

나는 당신이 그것을 위해 NHibernate에 사용할 수 있다고 생각하지 않습니다. 나는 사용자가 컴파일 된 객체를 채우기위한 매핑을 만드는 방법을 보여 주면 모든 데이터베이스 필드를 매핑하기 위해 NHibernate를 사용하고자한다고 가정합니다. 하지만 네가 할 수 있다고 생각하지 않아. 그러나보기를 사용하여 해결 방법이있을 수 있다고 생각합니다. 나는 대답에 그것을 게시 할 것이다. – frikinside

+0

Andrew Shepherd가 언급 한 것처럼 POCO 클래스가 존재하지 않는 한 동적 인 것을 지원하는 ORM이 필요합니다. 좋은 예가 있습니다 : http://www.toptensoftware.com/Articles/104/PetaPoco-Not-So-Poco-or-adding-support-for-dynamic – playful

답변

0

NHibernate 함께있을 수 있다고 생각하지 않지만 해결 방법을 사용할 수 있습니다. NHibernate 매핑 대신 테이블을 사용할 수 있습니다.

런타임에 필요한 특정 사용자 매핑을 사용하여 해당보기를 만들거나 업데이트 할 수 있습니다.

예를 들어, NHibernate의 매핑을 ViewMapped이라는 두 개의 열 NameMail이있는 뷰로 정의합니다. 그리고 다른 한편으로 사용자는 세 개의 열 Name, SecondName, EMail을 가진 테이블을 가지고 있습니다. 나는 그 당신을하는 데 도움이, 또는 적어도 솔루션을 안내하겠습니다

(SELECT Name + ' ' + SecondName as Name, EMail as Mail FROM tableName) AS ViewMapped 

: 다음과 같은 선택과 실행에보기를 만들 수 있습니다.

2

당신의 질문에서 나는 POCO 클래스가 존재하지만 당신은 빌드시 테이블이나 컬럼 이름을 알지 못한다고 해석합니다.

public class MyGenericClass 
{ 
    public virtual long Id { get; set; } 
    public virtual string Title { get; set; } 
} 

당신은 런타임에 테이블과 컬럼에 바인딩 수 : 당신은 이미이 클래스가 있다면

그래서,

string tableName; // Set somewhere else by user input 
string idColumnName; // Set somewhere else by user input 
string titleColumnName; // Set somewhere else by user input 

var configuration = new NHibernate.Cfg.Configuration(); 
configuration.Configure(); 

var mapper = new NHibernate.Mapping.ByCode.ModelMapper(); 

mapper.Class<MyGenericClass>(
      classMapper => 
      { 
       classMapper.Table(tableName); 
       classMapper.Id(
         myGenericClass => myGenericClass.Id, 
         idMapper => 
         { 
          idMapper.Column(idColumnName); 
          idMapper.Generator(Generators.Identity); 
         } 
       ); 
       classMapper.Property(c => c.Title, 
             propertyMapper => 
             { 
              propertyMapper.Column(titleColumnName); 
             } 
            ); 
      } 
); 

ISessionFactory sessionFactory = configuration.BuildSessionFactory(); 
ISession session = sessionFactory.OpenSession(); 

//////////////////////////////////////////////////////////////////// 
// Now we can run an SQL query over this newly specified table 
// 
List<MyGenericClass> items = session.QueryOver<MyGenericClass>().List();