4

일대일 관계가 있고 캐스케이드를 설정할 수 없으면 캐스케이드를 설정하면 "저장되지 않은 일시적인 인스턴스를 참조하는 개체를 얻습니다."라는 메시지가 나타납니다.Fluent nhibernate one-to-many

내 매핑과 같이 먼저 경우 새로운 푸의 SharedDetails을 저장하지 않고이

public class Foo 
{ 
    public Foo() 
    { 
     SharedDetails = new SharedDetails(); 
     SharedDetails.Foos.Add(this); 
    } 

    public Foo(SharedDetails sharedDetails) 
    { 
     SharedDetails = sharedDetails; 
     SharedDetails.Foos.Add(this); 
    } 

    public virtual Guid Id { get; set; } 
    public virtual SharedDetails SharedDetails { get; set; } 
} 

public class SharedDetails 
{ 
    public SharedDetails() 
    { 
     Foos = new List<Foo>(); 
    } 

    public virtual Guid Id { get; set; } 
    public virtual IList<Foo> Foos { get; set; } 
} 
그때, FOOS를 만들

등이

public class SharedDetailsMapping : ClassMap<SharedDetails> 
{ 
    public SharedDetailsMapping() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     HasMany(x => x.Foos); 
    } 
} 

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     References(x => x.SharedDetails).Cascade.SaveUpdate(); 
    } 
} 

클래스 다음과 같습니다

using (var transaction = _session.BeginTransaction()) 
{ 
    var shared = new SharedDetails(); 

    var fooOne = new Foo(shared); 
    _session.SaveOrUpdate(fooOne); 

    var fooTwo = new Foo(shared); 
    _session.SaveOrUpdate(fooTwo); 

    transaction.Commit(); 
} 

내가 잘못 한 것을 알아낼 수 없다면 SharedDetail을 저장하면 커밋됩니다. 처음 엔 캐스케이드 설정이 필요합니다. 당신의 SharedDetailsMapping에서

답변

6

, 수정하여 HasMany.Inverse()을 추가합니다 :

public class SharedDetailsMapping : ClassMap<SharedDetails> 
{ 
    public SharedDetailsMapping() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     HasMany(x => x.Foos) 
      .Inverse(); 
    } 
} 

을이 Foo는이 경우 (오른쪽 순서 관계에있는 개체를 저장 도움이되는 관계를 소유 NHibernate에 지시의 SharedDetails은 먼저 저장해야하므로 Foo을 저장할 때 ID가 저장됩니다.

목적에

또한 정보/때 역을 사용합니다 : NHibernate's inverse - what does it really mean?

는 TL, DNR 버전 :

당신이 당신의 클래스에 양방향 관계가있는 경우 (한쪽 hasMany의, 다른 쪽 참조) , HasMany는 .Inverse()이어야합니다.

+0

문제는 'SharedDetails'를 먼저 저장하고 싶지 않기 때문에 '새 Foo()'를 생성하고 저장하면 자동으로 생성되기를 바랍니다. 그게 가능하지 않니? – Christian

+0

매핑을 변경해도 만들기 및 저장에 대한 예제 코드는 변경되지 않습니다. 당신은 당신의 예에서 당신이 한 일을 여전히 할 수 있습니다. 그러나이 매핑 변경은 NHibernate가 내부적으로 저장할 순서를 결정하는 데 도움이된다. – HackedByChinese

+0

'Inverse'를 이미 추가하려고했지만 여전히 동일한 오류가 발생합니다. 'SharedDetails'작업을 저장했지만 캐스케이드 설정의 목적에 위배됩니다. – Christian