1

이것은 매우 분명한 질문 인 것 같지만 명확한 답을 찾을 수 없었습니다. DefaultCascade.All() 규칙을 사용하여 FluentNHibernate 자동 매핑을 사용하고 있습니다.엔티티를 일대 다 컬렉션에 추가 할 때 ONE 측의 값을 설정해야합니까?

엔티티는 저장되지만 일대 다 관계에서는 컬렉션에 추가하여 저장하더라도 여러 측면에서 한쪽을 제공해야합니다.

나는이 두 클래스있어 말할 수 있습니다 : 소유자의 개 컬렉션에 새로운 PetDog를 추가하기 위해

public class Owner 
{ 
    public virtual IList<PetDog> Dogs { get; set; } 
} 

public class PetDog 
{ 
    public virtual Owner Owner { get; set; } 
} 

를, 내가해야 같은 느낌 예는 아마 더 잘 설명 할 것 전화하실 수 있습니다

Owner.Dogs.Add(new PetDog()); 

내 Session을 처분하십시오. 그러나, 나는 그저 소유자가 저축하고 그것을 얻었습니다. 명시 적으로 설정하면

Owner.Dogs.Add(new PetDog { Owner = Owner }) 

작동합니다.

명시 적으로 값을 제공하지 않도록 할 수있는 방법이 있습니까?

+0

질문을 클래스 매핑과 테스트 코드로 업데이트 할 수 있습니까? – mickfold

답변

0

이 즉

HasMany(x => x.Dogs) 
    .Not.Inverse() 
    .Cascade.AllDeleteOrphan(); 

는 그 다음 PetDog 테이블의 OWNER_ID 외래 키가 채워집니다, 소유자 매핑 거짓 역을 = 설정하여 관계의 소유자로 소유자 클래스를 표시하여 수행 할 수 있습니다

,536 즉, 대신 새 데이터가 DB에 삽입되는 원인이되는 대신 session.Flush()를 호출 할 수 있습니다 거래를 사용하는 다른 방법 즉,

using (var transaction = session.BeginTransaction()) 
{ 
    var order = new Owner() {Dogs = new List<PetDog>()}; 
    order.Dogs.Add(new PetDog()); 
    order.Dogs.Add(new PetDog()); 

    session.Save(order); 
    transaction.Commit(); 
} 

를 저지

var order = new Owner() {Dogs = new List<PetDog>()}; 
    order.Dogs.Add(new PetDog()); 
    order.Dogs.Add(new PetDog()); 

    session.Save(order); 
    session.Flush(); // data persisted to DBMS here. 

session.Flush()의 사용은 권장되지 않습니다. 명시 적 트랜잭션이 사용되는 것이 좋습니다. 자세한 내용은 Ayende Rahien의 blog post을 참조하십시오.

+0

거래를하려면 트랜잭션을 사용해야합니까? –

+0

그냥 포함 시켜서 묻고 여전히 문제가있는 질문을 –

+0

아니요, 'session.Flush()'를 호출하거나'session.FlushMode'를 'FlushMode.Always'로 설정할 수도 있습니다. 가능한 옵션에 대한 자세한 내용으로 답변을 업데이트하겠습니다. – mickfold