我有一个简单的模型,其中 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"));
});
当我使用 Player
的 UpdateSelection
方法更改此列表时,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,现在我没有收到重复键错误。但是它不会删除我从列表中删除的号码。
最佳答案
因此在您定义的 Bag(现在是 Set)的映射中
m.Cascade(Cascade.All);
m.Inverse(true);
同时定义 Cascade 和 Inverse(true) 会相互抵触... Inverse(true) 意味着另一方应该负责更新更改,这将否定 Cascade 定义...
您应该尝试设置 Inverse(false),这将使 Bag 对实体负责。
关于c# - 一对多映射不是级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19357418/