2012-08-03 3 views
1

NHibernate는 단방향 연관을 사용할 때 외래 키로 구성된 고유 인덱스와 열을 갖지 못하게합니다. 나는 두 MethodParameters (: x와 이름 : 이름 Y)와 하나의 방법 인스턴스를 만드는 경우NHibernate를 사용하는 고유 합성 인덱스

//The classes 
public class Method 
{ 
    public virtual Guid ID { get; private set; } 
    public virtual List<MethodParameter> Parameters { get; private set; } 

    public Method() 
    { 
     this.Parameters = new List<MethodParameter>(); 
    } 
} 

public class MethodParameter 
{ 
    public virtual Guid ID { get; private set; } 
    public virtual string Name { get; private set; } 

    protected MethodParameter() { } 

    public MethodParameter(Method method, string name) 
    { 
     this.Name = name; 
     method.Parameters.Add(this); 
    } 
} 

//The mappings 
public class MAP_Method : ClassMap<Method> 
{ 
    public MAP_Method() 
    { 
     this.Table("[Method]"); 
     this.Id(x => x.ID).Access.BackingField().GeneratedBy.GuidComb(); 
     this.HasMany(x => x.Parameters) 
      .Access.BackingField() 
      .KeyColumn("[Method]") 
      .Not.LazyLoad() 
      .Cascade.AllDeleteOrphan(); 
    } 
} 

public class MAP_MethodParameter : ClassMap<MethodParameter> 
{ 
    public MAP_MethodParameter() 
    { 
     this.Table("[MethodParameter]"); 
     this.Map(x => x.Name).Length(50).Not.Nullable(); 
    } 
} 

는 아무 문제가 없다. 그러나 동일한 MethodParameter 이름을 사용하는 동일한 트랜잭션에서 두 개의 Method 인스턴스를 만드는 경우 고유 인덱스 위반이 발생합니다.

[MethodParameter] ([방법] ASC, [이름] ASC)에 고유 인덱스가 있고 단방향 연관으로 NHibernate가 먼저 [메소드] 열에 NULL이있는 자식 테이블을 삽입 한 다음 돌아가서 올바른 [메소드] 값으로 행을 업데이트합니다.

분명히 이것은 (Method1, "x") 대신 (null, "x") (null, "x")로 끝나기 때문에 동일한 MethodParameter 이름을 가진 두 개의 Method 인스턴스를 삽입 할 때 문제가됩니다 (Method2, "x")

나는 이것이 의도 된 동작이지만, 양방향 역 연관이 있거나 DB에서 고유 색인을 제거해야하는 것으로 보입니다. NHibernate에 올바른 [Method] ID를 삽입하도록하는 방법이 있습니까? NULL을 삽입하고 업데이트하는 것보다 삽입 할 때?

답변

1

귀하의 협회는 단방향이므로 다음과 같은 옵션을 설정해야합니다 : inverse="false" on association (<one-to-many>), not-null="true" on key (<key>). 매개 변수의 소유자를 변경하지 않으려는 경우 키 (<key>)에 update="false"을 설정해야합니다.

FK 열에 null이 삽입되는 것을 방지합니다. FluentNHibernate와

예 :

this.HasMany(x => x.Parameters) 
    .Not.Inverse()  // 1 
    .Not.KeyNullable() // 2 
    .Not.KeyUpdate() // 3 
    .Access.BackingField() 
    .KeyColumn("[Method]") 
    .Not.LazyLoad() 
    .Cascade.AllDeleteOrphan(); 

더 나은 설명 https://stackoverflow.com/a/7601312/259946https://stackoverflow.com/a/11576097/259946

+0

에 대해 다음 대답에서 봐 주시기 바랍니다 내가해야 할 일을했을 모든 NH 및하지의 최신 버전으로 업그레이드 할 것을 보인다 .KeyNullable()로 문제를 해결하기에 충분합니다. –

관련 문제