1

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?

4

1 回答 1

1

由于您的关联是单向的,您必须设置以下选项:inverse="false"关联 ( <one-to-many>)、not-null="true"键 ( <key>)。如果您不打算更改参数的所有者,则必须设置update="false"键 ( <key>)。

它将防止将 null 插入 FK 列。

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

于 2012-08-03T17:33:26.307 回答