一对多映射不是级联删除

时间:2013-10-14 09:41:38

标签: c# mysql nhibernate nhibernate-mapping

我有一个简单的模型,其中Player可以选择保存在Selection表中的整数的唯一Selection

看起来像这样

public class Player
{
    private readonly ICollection<Selection> selection;

    public Player()
    {
        this.selection = new List<Selection>();
    }

    public virtual long Id { get; set; }    
    public virtual string Name { get; set; }
    public virtual string EmailAddress { get; set; }

    public virtual IEnumerable<Selection> Selection
    {
        get
        {
            return this.selection;
        }
    }

    public virtual void UpdateSelection(IEnumerable<int> balls)
    {
        this.selection.Clear();
        this.selection.AddRange(balls.Select(ball => new Selection { Player = this, Number = ball }));
    }
}

public class Selection
{
    public virtual Player Player { get; set; }
    public virtual int Number { get; set; }
}

这就是我用来将选择映射到播放器的方法

this.Bag(
    x => x.Selection,
    m =>
        {
            m.Key(k => k.Column("PlayerId"));
            m.Access(Accessor.Field);
            m.Cascade(Cascade.All);
            m.Inverse(true);
        },
    k => k.OneToMany());

选择地图有一个组合ID

this.ComposedId(
    x =>
        {
            x.Property(y => y.Number);
            x.ManyToOne(y => y.Player, m => m.ForeignKey("PlayerId"));
        });

当我使用UpdateSelection Player方法更改此列表时,Selection表应在必要时插入和删除行。

但是,如果我在调用Session.Update方法时从Selection删除一个数字,我会收到以下错误

Duplicate entry '1-1' for key 'PRIMARY'Could not execute command: INSERT INTO Selection (PlayerId, Number) VALUES (?p0, ?p1)

哪个是自我解释,但修复它不是。为什么要重新添加数字,不应该删除我删除的数字吗?

更新

我将贴图从Bag更改为Set,现在我没有得到重复键错误。但是它不会删除我从列表中删除的号码。

1 个答案:

答案 0 :(得分:0)

所以在你的Bag(现在Set)的映射中你定义了

        m.Cascade(Cascade.All);
        m.Inverse(true);

定义两者,Cascade和Inverse(true)将相互作用...反向(true)意味着另一方应该负责更新更改,这将取消Cascade定义......

您应该尝试设置Inverse(false),这将使Bag负责该实体。