2011-04-24 6 views
1

우리는 모든 테넌트가 동일한 데이터베이스를 공유하는 NHibernate를 사용하여 다중 테넌트 애플리케이션을 개발 중입니다.NHibernate - 테넌트 특정 테이블 접두사 사용

우리가 고려한 한 가지 옵션은 우리 데이터베이스 객체에 대한 임차인 고유의 접두어를 사용하는 것입니다 (나는 Orchard와 동일한 방식이라고 생각합니다).

이것은 최소한 우리에게 임차인 데이터에 대한 복구 모델을 제공 할 것이고 대부분의 쿼리에 tenantid 필터를 포함하지 않아도된다는 것을 의미합니다.

제 질문은 -이 전략을 사용한 사람이 있습니까? 그렇다면 어떻게 그것에 대해 가셨습니까?

특히 모든 테넌트에 대해 동일한 SessionFactory를 사용할 수 있으며 NHibernate를 사용하여 런타임시 "새"테넌트에 대한 새로운 테이블 세트를 생성 할 수 있습니다 (이렇게하는 것이 안전 할 수 있습니다).

감사 벤

[업데이트]

이 가치 조사했지만 결국 우리는 공유 스키마가 우리의 필요에 더 적합 것을 결정했다. 세입자 별 스키마는 세입자 데이터를 명확하게 분리하지만 유지 관리를 더욱 어렵게 만듭니다. 우리의 세입자는 소량의 데이터 만 저장하기 때문에, 10 개의 테이블 * 1K 세입자가 있다고 생각하면 약간의 불편 함이 있습니다.

답변

2

고려해야 할 몇 가지 사용자 지정/확장 지점이 있습니다.

세입자간에 동일한 세션 팩토리를 공유 할 수 없다고 생각합니다. 가장 간단한 방법은 세션 팩토리와 관련된 임차인을 기준으로 맵핑을 업데이트하는 것입니다.

public class EntitytMap:ClassMap<Entity> 
{ 
    public EntitytMap() 
    { 
     Table("TableName"); 
     Schema(Session.TenantName); 
     Id(p => p.Id, "Id").GeneratedBy.Identity(); 

각 테넌트를 각각의 스키마에 포함하려면이 방법이 효과적입니다.

public class EntityMap:ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Table(Session.TenantPrefix + "TableName"); 
     Schema("SCHEMA"); 
     Id(p => p.Id, "Id").GeneratedBy.Identity(); 

당신은 또한 자신의 ConnectionProvider를 제공 시도 할 수 있습니다 : 동일한 스키마를 유지하지만 테이블에 접두어가있는 경우에 변경 될 수 있습니다. 당신이 당신의 자신의 연결을 지정할 수 있으며,의 getConnection 공급자가 호출 될 때

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 

사용

<property name="connection.provider">My.Project.DAL.NHibernate.CustomConnectionProvider, My.Project.DAL</property> 

: NHibernate.Connection.DriverConnectionProvider에서 클래스를 파생하고 대신 NHibernate에 구성 파일에 자신의 복사본을 참조 테넌트에 기반한 문자열.

+0

유창한 nhibernate로 이것을 수행하는 방법을 알아 주셔서 감사합니다. 연결 문자열 공급자는 유효한 지점입니다. 특정 스키마에 대한 액세스 권한 만 가진 각 클라이언트에 대한 로그인이 있어야하기 때문입니다. –

0

우리가 런타임에 "새로운"세입자 테이블의 새로운 세트를 생성하는 자 NHibernate를 사용할 수 있습니다 (안전하게 그렇게하는 것입니다)

난 당신이 원하지 않는 것이 좋을 것 이러한 DDL 작업을 수행하는 데 필요한 권한 수준을 웹 응용 프로그램에 부여합니다. 난 정상적인 DML 작업에 대한 최소 수준의 권한으로 웹 응용 프로그램을 남겨두고 '프로비저닝 서비스'로 작동하는 백그라운드 서비스를 가질 수 있습니다. 그 역할은 새 임차인을위한 스키마 수정 일뿐 아니라 새 폴더 만들기, IIS 구성 등과 같은 다른 임차인 프로비저닝 작업을 배치하기에 좋은 장소이기도합니다. 이러한 모든 작업에는 시간이 걸리고 단일 웹에서 수행하지 않는 것이 가장 좋습니다 의뢰.백그라운드 데이터베이스는 프로비저닝 테이블을 업데이트하고 완료 될 때까지 진행 상황에 대한 정보로 업데이트하며 웹 UI는 다음 단계로 이동합니다.

+0

감사합니다. "가입"신청서에서 새 임차인을 제공하는 것은 우리의 의도가 아닙니다. 우리는 Azure에 배포하므로 준비 작업자 역할을 사용하게 될 것입니다. –