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을 삽입하고 업데이트하는 것보다 삽입 할 때?
에 대해 다음 대답에서 봐 주시기 바랍니다 내가해야 할 일을했을 모든 NH 및하지의 최신 버전으로 업그레이드 할 것을 보인다 .KeyNullable()로 문제를 해결하기에 충분합니다. –