2013-10-14 133 views
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")); 
     }); 

當我更改使用的PlayerUpdateSelection方法則Selection表應插入和刪除行必要這個名單。

但是,如果我請從Selection一些當Session.Update方法被調用我收到以下錯誤

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

這是自我解釋,但固定事實並非如此。爲什麼它試圖重新添加數字,它不應該刪除我刪除的數字嗎?

更新

我改變從包映射到一個集合,現在我沒有得到重複鍵錯誤。但它不會刪除我從列表中刪除的號碼。

在您的袋(今集)的映射

回答

0

所以你定義

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

定義兩者級聯和反(真)會工作互相...逆(真)表示對方應該照顧更新更改,這將取消級聯定義...

您應該嘗試設置反向(false),這將使Bag對實體負責。

+0

感謝您的回覆@Ela,我更新了地圖的建議,現在我得到以下錯誤:NonUniqueObjectException:具有相同標識符值的不同對象已與會話相關聯 – JConstantine

+0

我認爲它主要是因爲你執行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

+0

Evict並沒有真正產生任何結果。但我修改了UpdateSelection函數,只有需要被刪除的數字。這似乎現在工作正常 – JConstantine