-1

어떻게 이러한 기존 테이블을 아래 클래스에 매핑합니까? 연락과 일대일 관계에있는Fluent NHibernate를 사용하여 일대일 부모 - 자식 테이블을 클래스로 축소하는 방법?

CREATE TABLE dbo.UserContact (
    UserContactId int NOT NULL IDENTITY (1, 1), 
    UserId int NOT NULL, 
    ContactId int NOT NULL, 
    UserContactTypeId int NOT NULL, 
    FromDt datetime NULL, 
    ThruDt datetime NULL, 
    CreateDt datetime NOT NULL, 
    UpdateDt datetime NULL, 
    IsDeleted bit NULL, 
    CanSolicit bit NOT NULL 
) 

CREATE TABLE dbo.Contact (
    ContactId int NOT NULL IDENTITY (1, 1), 
    CreateDt datetime NOT NULL, 
    UpdateDt datetime NULL 
) 

CREATE TABLE dbo.Electronic (
    ContactId int NOT NULL, 
    URL nvarchar(512) NOT NULL, 
    ElectronicType smallint NULL 
) 

CREATE TABLE dbo.Phone (
    ContactId int NOT NULL, 
    AreaCode nchar(3) NOT NULL, 
    PhoneNb nchar(7) NOT NULL, 
    Extension nchar(6) NULL, 
    PhoneType smallint NULL 
) 

CREATE TABLE dbo.Postal 
(
    ContactId int NOT NULL, 
    Street nvarchar(256) NOT NULL, 
    Specifier nvarchar(256) NULL, 
    GeocodeId int NULL 
) 

표 전자, 전화 및 우편 :

나는 다음과 같은 테이블이있다. UserContact 테이블은 Contact와 다 대일 관계에 있습니다. UserContact는 User와 Contact 사이의 연관 테이블입니다.

또한 다음과 같은 클래스있다 : 그래서

public class Electronic : IntegerKeyEntity 
{ 
    public virtual ContactId { get; set; } 
    public virtual DateTime CreateDt { get; set; } 
    public virtual DateTime? UpdateDt { get; set; } 
    public string Url { get; set; } 
    public ElectronicType Type { get; set; } 
} 

public class Postal : IntegerKeyEntity 
{ 
    public virtual ContactId { get; set; } 
    public virtual DateTime CreateDt { get; set; } 
    public virtual DateTime? UpdateDt { get; set; } 
    public string Street { get; set; } 
    public string Specifier { get; set; } 
    public Geocode Geocode { get; set; } 
} 

public class Phone : IntegerKeyEntity 
{ 
    public virtual ContactId { get; set; } 
    public virtual DateTime CreateDt { get; set; } 
    public virtual DateTime? UpdateDt { get; set; } 
    public string AreaCode { get; set; } 
    public string PhoneNb { get; set; } 
    public string Extension { get; set; } 
    public PhoneType Type { get; set; } 
} 

public class UserContact : IntegerKeyEntity 
{ 
    private ICollection<Electronic> electronics = new HashSet<Electronic>(); 
    private ICollection<Phone> phones = new HashSet<Phone>(); 
    private ICollection<Postal> postals = new HashSet<Postal>(); 

    // props 

    public virtual IEnumerable<Electronic> Electronics { get { return electronics; } } 
    public virtual IEnumerable<Phone> Phones { get { return phones; } } 
    public virtual IEnumerable<Postal> Postals { get { return postals; } } 
} 

, 나는 내가 세 가지 클래스에 이르기까지 네 연락 테이블 (부모와 자식)에서받을 수 있나요? 그리고이 세 클래스를 UserContact 테이블에 매핑하는 방법은 무엇입니까? 나는 각 클래스에 대해 하나씩 3 명의 ILists를 가질 수 있다고 가정합니다.

답변

1

내가 잘못 모델링 한 것 같습니다. Electronic, Phone 및 Postal이 Contact (연락 대상에서 상속)를 연장하고 이는 도메인 모델에서 표현되어야하는 것으로 보입니다. 이러한 클래스는 일대일로 연락처와 관련이 없으며 추상 연락처 유형을 확장하는 구체적인 유형입니다. 이런 식으로 모델링하면 table-per-subclass inheritance mapping을 사용하여 연락처를 매핑 할 수 있습니다.

사용자는 연락처와 다 대 다 관계를 가지며 사용자의 연락처 컬렉션에는 모든 유형의 연락처가 포함됩니다.

개인적으로 모든 연락처 유형을 하나의 테이블에 넣고 더 간단한 클래스 별 매핑을 사용합니다.

+0

수정. 세 개의 하위 테이블은 데이터베이스에서 상위 Contact 테이블을 확장합니다. 연락처 테이블을 보이지 않게 만들고 자식 독립 클래스를 만들어서 중간 계층을 단순하게 유지하려고 노력한 것 같습니다. 나는 돌아가서 당신이 제안한 것처럼 할 수도 있지만, 내 마음을 바꾸지 않는다고 가정하면 위의 것이 가능합니까? 그렇다면 어떻게? – alphadogg

+0

당신이하려고하는 것은 상속을 사용하는 것보다 훨씬 더 복잡합니다. 특히 테이블 당 클래스 매핑을 사용하는 경우 더욱 그렇습니다. 상속을 사용하면 매핑을 제외하고 여전히 연락처 테이블이 보이지 않습니다. 마음이 바뀌지 않으면 세 가지 연락처 유형에 대한보기를 사용하는 것이 좋습니다. –

+0

나는 당신이 권장했던대로 해왔다. 변경해야하는지 알 수 있습니다. 일찍 일을 복잡하게 할 필요가 없습니다. – alphadogg

관련 문제