【问题标题】:One to Many mapping not Cascading deletes一对多映射不是级联删除
【发布时间】:2013-10-21 20:27:20
【问题描述】:

我有一个简单的模型,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"));
        });

当我使用PlayerUpdateSelection 方法更改此列表时,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,现在我没有收到重复键错误。但是它不会删除我从列表中删除的号码。

【问题讨论】:

    标签: c# mysql nhibernate nhibernate-mapping


    【解决方案1】:

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

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

    同时定义 Cascade 和 Inverse(true) 将相互影响... Inverse(true) 意味着另一方应负责更新更改,这将否定 Cascade 定义...

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

    【讨论】:

    • 感谢您的回复@Ela,我按照建议更新了地图,现在我收到以下错误NonUniqueObjectException: a different object with the same identifier value was already associated with the session
    • 我认为这主要是因为您如何执行 UpdateSelection。您删除所有当前条目,然后插入新条目。这不是我会用 nHibernate 做的事情,因为 nH 确实会处理所有对象引用,如果你破坏它,你还必须删除这些引用。您可以使用 session.evict 删除某些内容,也可以在这里查看stackoverflow.com/questions/2983749/… 以获得另一个答案
    • 驱逐并没有真正产生任何结果。但是我修改了 UpdateSelection 函数,以便只删除需要删除的数字。这似乎现在工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多