2009-02-27 2 views
1

저장 :자 NHibernate 상속 문제 나 문제에 봉착 차일

[Class(Table = "Users", Name = "User")] 
public class User 
{ 
    [Id(0, Column = "UserId", Type = "Guid", Name = "Id")] 
    [Generator(1, Class = "assigned")] 
    public Guid Id { get; set; } 

    [Property(Name = "Password", Column = "Password", Type = "String")] 
    public string Password { get; set; } 

    [Property(Name = "Email", Column = "Email", Type = "String")] 
    public string Email { get; set; } 
} 

그리고 ditributor :

[JoinedSubclass(ExtendsType = typeof(User), Table = "Distributors")] 
public class Distributor : User 
{ 

    [Id(0, Column = "DistributorId", Type = "Guid", Name = "Identifier")] 
    [Generator(1, Class = "assigned")] 
    protected Guid Identifier { get; set; } 

    [Property(Name = "Company", Column = "Company", Type = "String")] 
    public String Company { get; set; } 
} 

가 지금은 유통 업체에 대한 사용자를 촉진 할 필요가 나는 사용자가 있습니다. 그러나 나는 그의 신분 (시스템의 다른 부분이 그것을 사용하고있다)을 구해야한다. 나는 새로운 배포자를 만들고 사용자를 얻고 있습니다. 하지만 배포자를 구하려고 할 때 다음 오류가 발생합니다.

동일한 식별자 값을 가진 다른 객체가 이미 세션 : ec6f6a9f-a236-4385-835c-7f408a5f594d (엔티티의 MLMCore)와 연결되어 있습니다. 엔티티 디스트리뷰터

모든 메소드 (Save, SaveOrUpdade, SaveOrUpdateCopy, Update)를 시도했습니다. 그러나 그것은 효과가 없습니다. 어떤 아이디어로 그것을 고치는 법? 세션이 해당 ID와 User의 인스턴스를 포함, 그래서 당신은 해당 ID와 다른 User (A Distributor) 저장하려고하면, NHibernate에 불평 -

답변

1

오류는 말씀입니다. 당신 Distributor을 저장하기 전에 세션 (session.Clear()를) 삭제 시도 할 수 있지만, NHibernate에이 Distributor 테이블 갑자기 User에 저장에 성공할 수 있을지 모르겠어요.

디자인을 변경할 수있는 위치에 있다면 그렇게하는 것이 좋습니다. 일반적으로 전문화 유형이 변경 될 수있는 경우 상속을 사용하지 않아야합니다. 귀하의 도메인에 어떤 종류의 Role을 소개하는 것이 훨씬 더 편리하고 편리합니다.

도메인의 특성을 알지 못하는데도 어쩌면 영감을 줄 수 있습니다. 사용자를 단지 허용하는 방법은 어떨까요? User의 경우 그런 다음 User 컨테이너는 IList<Role> 일 수 있으며 Role은 예 : Distributor (관련이 있다면 다른 역할)?

또는 User을 가리키는 IList<Distributor>이 회사에 들어가게하는 방법에 대해 알려주세요.

+0

역할이 디자인되었습니다. 하지만 배포자를위한 추가 필드가 필요합니다. 그리고 상속은 사용자 엔티티를 더 넓게 만드는 데 사용됩니다. –

+0

. 그렇다면 왜 당신의 역할을 추상적으로 만들지 말고 그 역할에 맞는 데이터로 전문화를 동반하십시오. – mookid8000

+0

아쉽게도 디자인을 변경하는 것이 불가능하므로이 상황에서 해결 방법을 찾아야합니다. ( –