2010-11-29 4 views
3

ProbateCases 테이블과 Properties 테이블이있는 데이터베이스가 있습니다. Properties 테이블에는 ProbateCase 테이블에 대한 외래 키가 ProbateCaseId라고되어 있으므로 ProbateCases와 Properties 사이의 관계는 일대 다입니다.Fluent NHibernate : 단방향 연관에 외래 키 필드가 설정되어 있지 않음

내 도메인 계층에는 ProbateCase 클래스와 Property 클래스가 있습니다.

private IList<Property> _properties = new List<Property>(); 
public virtual IEnumerable<Property> Properties { get { return _properties; } } 
public virtual Property AddProperty() 
    { 
     Property property = new Property(); 
     _properties.Add(property); 
     return property; 
    } 

유창 NHibernate에 매핑의 해당 부분은 다음과 같습니다 : 다음과 같이 ProbateCase 클래스가 정의 된 속성의 컬렉션을 가지고 협회는 단방향입니다

HasMany(x => x.Properties).Where("Deleted = 0").KeyColumn("ProbateCaseId").Cascade.All().Access.CamelCaseField(Prefix.Underscore); 

주 - ProbateCase 클래스가있는 속성 모음은 있지만 ProbateCase 멤버가 Property 클래스에 없습니다.

나는 쿼리가 잘 작동한다는 것을 알았습니다. NHibernate는 적절한 ProbateCaseId 값을 가진 Properties를 얻기 위해 적절한 SQL을 생성하고 있습니다.

그러나 새 속성을 추가 한 ProbateCase를 저장할 때 INSERT SQL에 외래 키 필드의 값이 포함되어 있지 않으므로 외래 키에 NULL 값이 포함 된 SQL 예외가 발생합니다.

INSERT INTO AdminOverview.Properties (PropertyName) VALUES ('Name of property') -- Where the hell is the ProbateCaseId field value??? 

NHibernate가 외래 키 값 자체를 채울 것으로 예상합니까? 그렇지 않으면 내가해야 할 일이 있습니까? http://nhibernate.info/doc/nh/en/index.html#collections-onetomany에서

답변

2

:

매우 중요 참고 : 협회의 컬럼이 NOT NULL로 선언 된 경우 연관을 생성 (변경) 할 때, NHibernate에이 제약 조건 위반이 발생할 수 있습니다. 이 문제를 방지하려면 inverse = "true"로 표시된 많은 가치있는 끝 (집합 또는 가방)과 양방향 연관을 사용해야합니다. 이 장 뒷부분의 양방향 연결에 대한 설명을 참조하십시오.

+0

감사합니다. Diego. 나는 이것을 전에 보았다. 그러나 그것은 정말로 나에게 의미가 없었다. FK 필드가 nullable인지 여부에 대한 질문이 아닙니다. NHibernate에 의해 설정 될 필드가 필요하며 존재하지 않습니다. 나는 이유를 모른다. 어쨌든, 나는 이미 양방향으로 연결하여 고정 시켰지만 속성에서 ProbateCase에 액세스 할 수있는 의미 상 의미가 없기 때문에 해킹입니다. – David

+3

기분이 나아진다면 * everyone *은 이것이 양방향으로 만들지 않으면 작동 할 것이라고 생각합니다. (그리고 잠시 동안 Java Hibernate에서 작동했다는 것을 이해합니다.) 현재 구현의 한계에 불과합니다. –

+0

설명해 주셔서 감사합니다. 다른 독자의 이익을 위해서 NHibernate에서 단방향 연관을 할 수 있지만 두 가지 가능한 방법 중 하나에서만 가능합니다. '클래스 A에는 하나의 클래스 B'연관이 있어야하며 '클래스 B에는 많은 클래스로 분류 됨'연관이 없어야합니다. – David

관련 문제