0

필자는 내 테이블에 기존 테이블이 있고 기존 데이터와 함께 작동 할 도메인을 만들어야합니다.FluentNHibernate를 정규화하지 않고 기존 테이블에 매핑

다음
Application 
'ORDERSCANNER' 

ApplicationFunction 
'ORDERSCANNER','SCAN' 
'ORDERSCANNER','READ' 
'ORDERSCANNER','PRINT' 

FunctionalGroup 
'ADMIN','RUS','ORDERSCANNER','SCAN' 
'ADMIN','RUS','ORDERSCANNER','PRINT' 
'ADMIN','JAP','ORDERSCANNER','SCAN' 
'ADMIN','JAP','ORDERSCANNER','PRINT' 
'OPERATOR','RUS','ORDERSCANNER','SCAN' 
'OPERATOR','JAP','ORDERSCANNER','SCAN' 

User 
'IVANOV','RUS','OPERATOR' 
'PETROV','RUS','OPERATOR' 
'PETROV','JAP','OPERATOR' 
'SIDOROV','RUS','ADMIN - he is an ADMIN group but only for RUS. He is not able to scan for JAP 

내가의 사용자를 살펴 보자 내 도메인

public class Application // root 
{ 
    private readonly List<ApplicationFunction> _functions; 
    public string ApplicationId { get; set; } 

    public Application() 
    { 
     _functions = new List<ApplicationFunction>(); 
    } 
    public void AddFunction(string newFunction) 
    { 
     var function = new ApplicationFunction(this, newFunction); 
     _functions.Add(function); 
    } 
} 
public class ApplicationFunction // value object 
{ 
    public Application Application { get; private set; } 
    public string FunctionId { get; private set; } 

    public ApplicationFunction(Application application, string functionId) 
    { 
     if (application == null) throw new ArgumentNullException("application"); 
     if (functionId == null) throw new ArgumentNullException("functionId"); 
     Application = application; 
     FunctionId = functionId; 
    } 
} 
public class FunctionalGroup // root 
{ 
    private readonly List<ApplicationFunction> _functions; 
    public string GroupId { get; set; } 
    public string MarketingPlanCode { get; set; } 
    public IEnumerable<ApplicationFunction> Functions { get { return _functions; } } 

    public FunctionalGroup() 
    { 
     _functions = new List<ApplicationFunction>(); 
    } 
    public void AddFunction(ApplicationFunction applicationFunction) 
    { 
     _functions.Add(applicationFunction); 
    } 
} 
public class User // root 
{ 
    private readonly List<FunctionalGroup> _groups; 
    public string UserId { get; set; } 
    public IEnumerable<FunctionalGroup> Groups { get { return _groups; } } 

    public User() 
    { 
     _groups = new List<FunctionalGroup>(); 
    } 
    public void AddToGroup(FunctionalGroup functionalGroup) 
    { 
     _groups.Add(functionalGroup); 
    } 
} 

를 참조하는 방법입니다

나는 다음 테이블 구조를 가지고있다.

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.UserId).Column("USER_ID"); 
     HasMany(x => x.Groups).Cascade.All(); 
    } 
} 

필자는 FunctionalGroup의 내 컬렉션에서 매핑 할 추가 데이터가 필요합니다. 이는 MarketingPlanCode입니다. 내 User 클래스에 MarketingPlanCode 속성을 추가하면 컬렉션 당 하나의 속성 만 가져옵니다. 하지만 그 컬렉션에있는 아이템마다 속성이 필요합니다.

글쎄, 내가 필요한 것을 설명 할 수 없다면, 내 테이블의 예제 데이터를 살펴 보라. 그것을 매핑 할 방법이 있습니까?

+0

do 함수는 각 함수가 다른 코드를 실행하는 논리를 나타 냅니까? 어떤 종류의 전략 패턴? – Firo

답변

1

나는 모델이 더 단순화 될 수 있다고 생각하지만 먼저 FunctionalGroup 클래스를 완전히 버립니다.

public ApplicationFunctionMap() 
{ 
    CompositeId() 
     .KeyReference(x => x.Application, "application_id") 
     .KeyProperty(x => x.FunctionId, "FunctionId"); 
} 

public UserMap() 
{ 
    Component(x => x.Group, c => 
    { 
     c.Map(g => g.Name, "GroupId"); 
     c.Map(g => g.MarketingPlanCode, "MarketingPlanCode"); 
    }) 

    HasManyToMany(x => x.AllowedFunctions) 
     .Table("FunctionalGroup") 
     .ParentKeyColumns.Add("GroupId", "MarketingPlanCode") // in FunctionalGroup table 
     .ChildKeyColumns.Add("application_id", "FunctionId") // in FunctionalGroup table 
     .Propertyref(x => x.Group); // Component defined above 
} 
+0

자, 구성 요소에 대한 아이디어는 얻었지만 컬렉션에는 대한 아이디어가 없습니다. 이것은 무엇을 의미 하는가? 그리고 Id는 UserMap에 대해 어디에 있습니까? –

+0

HasManyToMany 매핑에 영향을 미치지 않기 때문에이 ID를 생략했습니다. FunctionalGroup 테이블은 compositeIds가있는 링크 테이블이며 NHibernate를 사용하면 클래스가 필요 없습니다. 상위 및 하위에 대한 외래 키 열을 매핑하면되며 부모에 대한 조인은 PropertyRef를 사용하는 기본 키/ID를 사용하지 않기 때문에. 시도해보고 작동하는지 알려주십시오. – Firo