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();
}
}
如果我使用两个 MethodParameters(名称:x 和名称:y)创建单个 Method 实例,则没有问题。但是,如果我在同一个事务中使用相同的 MethodParameter 名称创建两个 Method 实例,那么我会遇到唯一索引冲突。
这是因为我在 [MethodParameter] ([Method] ASC, [Name] ASC) 上有一个唯一索引,并且具有单向关联 NHibernate 首先为 [Method] 列插入具有 NULL 的子表,然后返回并更新具有正确 [Method] 值的行。
显然,当插入两个具有相同 MethodParameter 名称的 Method 实例时,这是一个问题,因为我最终得到 (null, "x") (null, "x") 而不是 (Method1, "x") (Method2, "x")
我知道这是设计的行为,但似乎我被迫要么进行双向反向关联,要么从数据库中删除唯一索引。有没有办法让 NHibernate 在插入而不是插入 NULL 然后更新时插入正确的 [方法] ID?