2
我有一個簡單的模型,其中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
表應插入和刪除行必要這個名單。
但是,如果我請從Selection
一些當Session.Update方法被調用我收到以下錯誤
Duplicate entry '1-1' for key 'PRIMARY'Could not execute command: INSERT INTO Selection (PlayerId, Number) VALUES (?p0, ?p1)
這是自我解釋,但固定事實並非如此。爲什麼它試圖重新添加數字,它不應該刪除我刪除的數字嗎?
更新
我改變從包映射到一個集合,現在我沒有得到重複鍵錯誤。但它不會刪除我從列表中刪除的號碼。
在您的袋(今集)的映射
感謝您的回覆@Ela,我更新了地圖的建議,現在我得到以下錯誤:NonUniqueObjectException:具有相同標識符值的不同對象已與會話相關聯 – JConstantine
我認爲它主要是因爲你執行UpdateSelection。您刪除所有當前條目,然後插入新條目。那不是我會用nHibernate做的事情,因爲nH確實照顧了所有的對象引用,如果你打破它,你也必須刪除這些引用。你可以使用session.evict刪除一些東西,也可以在這裏看看http://stackoverflow.com/questions/2983749/nhibernate-a-different-object-with-the-same-identifier-value-was-already-assoc for another回答 – MichaC
Evict並沒有真正產生任何結果。但我修改了UpdateSelection函數,只有需要被刪除的數字。這似乎現在工作正常 – JConstantine