2010-01-02 4 views
1

나는 임무를 완수하는 방법을 알아 내려고 노력 해왔다. 사실 내가 향하고있는 방향조차도 실제로는 불명예 스럽다. 내 SQL 테이블 중 -하지만 그것은 내가 생각할 수있는 가장 간결합니다.NHibernate 매핑 - 이것을 달성하는 방법

제 문제는 설명하기가 쉽습니다. 코멘트를 포함하는 테이블을 가지고 있는데, 내 User 테이블에 대한 외래 키 (코멘트 작성자를 나타냄)가 있습니다. 익명 사용자를 올바르게 지원하기 위해이 foreign 키를 null로 만들 수 있도록 결정했습니다. 또한 이름, 전자 메일 및 웹 사이트를 지정하는 데 3 개의 열을 제공하여 사용자가 익명 인 경우 관련된 정보를 저장하려고합니다.이 필드도 null 허용. 사용자가 로그인되어있는 경우

그래서

  • 짧은

    에서 외래 키가 해당 사용자 및 이름의 ID가 포함됩니다, 이메일 및 웹 사이트는 null가됩니다.
  • 사용자가 로그인하지 않은 경우 외래 키는 null이고 이름, 전자 메일 및 웹 사이트에는 사용자에 대한 데이터가 포함됩니다.

내 도메인 모델에서이를 사용자 클래스 (내 의견 클래스의 저자, ​​속성)에 매핑하고 싶습니다. 그런 다음이 User 클래스에는 "IsAnonymous"라는 속성이 있습니다.이 속성은 그에 따라 설정해야합니다.

외부 키의 값에 따라이 작성자 속성을 매핑하고 이러한 속성을 올바르게 할당하는 매핑을 설정하는 것이 이상적입니다. 이미 User 테이블에 매핑하는 User 클래스에 대한 매핑이 있지만 다른 방법으로이 작업을 수행하는 방법을 잘 모르겠습니다.

IUserType 인터페이스를 살펴 보았지만이 두 가지 테이블을 읽어야하는이 문제에 대해 이전에 어떻게 이해할 수 없었습니다.

현재 데이터베이스 구조를 사용하여 합리적인 방법이 있습니까? 아니면 내 레이아웃을 전환해야합니까? 그렇다면 무엇을해야합니까?

내 사용자 테이블에 익명 사용자를 나타내는 간단한 열이있는 것을 전환했지만 이름 열이 고유 키로 설정되면 문제가 발생하기 시작했습니다. 등록 된 사용자가 익명 사용자가 아닌 고유 이름을 갖기를 원합니다.

감사합니다.

편집 : 그 동안 읽고 어쩌면 일부 ASCII/의사-SQL 다이어그램 당신이 원한다면 나는, 그러나 그

//map this in NH 
public virtual User LoggedInCreator {get;set;} 
//Not mapped 
public virtual User CreatorInformation { 
    get { 
     if(LoggedInCreator != null) return LoggedInCreator; 
     return new User { 
       Name = AnonymousCommenterName, 
       Email = AnonymousCommenterEmail, 
       Website= AnonymousCommenterWebsite 
      }; 
    } 
} 
public void SetAnonymouscommenter(string name, string email, string website) 
{ 
    LoggedInCreator = null; 
    AnonymousCommenterName = name; 
    AnonymousCommenterEmail = email; 
    AnonymousCommenterWebsite = website; 
} 

같은이있을 것이다 편리한

User 
----- 
UserId Guid PRIMARY KEY 
Name nvarchar(200) UNIQUE KEY NOT NULL 
Email nvarchar(200) NOT NULL 
Website nvarchar(200) NOT NULL 

Comment 
------- 
CommentId Guid PRIMARY KEY 
UserId GUID - FK-USER 
Name nvarchar(200) 
Email nvarchar(200) 
Website nvarchar(200) 

답변

1

에 와서 않기로 결정 훨씬 더 깔끔한 방법으로을 수행하면, 필드과 그 값을 필드에 저장하는 매핑 속성을 매핑 할 수있는 NHibernate의 훌륭한 기능을 사용할 수 있습니다. 여기
는 청소기 구현 될 것입니다 :

protected User _commenter; 
public virtual User Commenter 
{ 
    get { 
     if(_commenter != null) return _commenter; 
     return new User { 
       Name = AnonymousCommenterName, 
       Email = AnonymousCommenterEmail, 
       Website= AnonymousCommenterWebsite 
     }; 
    } 
    set { 
     bool isAnonymous = value.Id == 0; 
     _commenter = isAnonymous ? null : value; 
     AnonymousCommenterName = isAnonymous ? value.Name : null; 
     AnonymousCommenterEmail = isAnonymous ? value.Email : null; 
     AnonymousCommenterWebsite = isAnonymous ? value.Website : null; 
    } 
} 

당신은 그들이 본질적으로하지만 같은 생각, NHibernate에 기능을 사용하여 좀 정리하다 볼 수 있습니다.

+0

이것은 작동 할 수 있습니다!나는 현재 내 NHibernate 특정 유스 케이스에 내 코멘트 클래스를 서브 클래스하고 NHibernate 코드에서만이 접근법을 사용하고있다. 나는 그것이 일할 수 있는지보기 위해 이것을 시험해보고 나면 다시 돌아올 것이다. :). – kastermester

+0

감사합니다, 당신의 제안은 저를 일하는 것처럼 보이게했습니다. NH 레이어에서 이것을 구현하는 코드는 약간 있지만, 다른 한편으로는이 코드를 다른 곳에서 사용하는 것이 좋으며, 내 머리에 의미있는 방식으로 데이터베이스에 저장됩니다. :) – kastermester