2012-05-08 66 views
1

我通常不处理这样的数据,但我想id试试看。事实证明,我失败了:/并不确定如何继续。流利Nhibernate:不能删除一个项目作为HasMany属性

我有一个数据库对象跟踪:

public virtual string Type { get; set; } 

public virtual IList<DateTypeTrack> TrackDates { get; set; } 

使用映射文件:

Table("Tracks"); 
Map(x => x.Type).Not.Nullable(); 
HasMany(x => x.TrackDates).KeyColumn("TrackID").Cascade.All(); 

的DateTypeTrack对象看起来是这样的:

public virtual DateType DateType { get; set; } 
public virtual Track Track { get; set; } 
public virtual int Days { get; set; } 

有了这样的映射文件:

Table("DateTypeTracks"); 
References(x => x.DateType, "DateTypeID").Not.Nullable(); 
References(x => x.Track, "TrackID").Not.Nullable(); 
Map(x => x.Days).Not.Nullable(); 

如果有必要的话,我也会发布DateType代码,但我不认为它是必需的。

,我试图写在我的服务层的删除方法很简单:

public void PushDelete(int id) 
    { 
     Track track = _tracks.Get(id); 

     try 
     { 
      _tracks.BeginTransaction(); 
      _tracks.Delete(track); 
      _tracks.CommitTransaction(); 
     } 
     catch (Exception) 
     { 
      _tracks.RollbackTransaction(); 
      throw; 
     } 
    } 

我不断收到错误:

could not delete collection: [TSE.Domain.DatabaseObjects.Track.TrackDates#12][SQL: UPDATE DateTypeTracks SET TrackID = null WHERE TrackID = @p0] 

我不知道为什么它试图做最后更新,但我想这是什么原因造成的问题。我有什么样的追索权?

谢谢。

回答

3

因为DateTypeTrack已经关心的两个实体之间的关联,你应该纪念的hasMany为Inverse告诉NH的的hasMany不维护它(更新)

HasMany(x => x.TrackDates).KeyColumn("TrackID").Cascade.All().Inverse(); 
+0

所以,我应该删除的项目在删除主对象之前? –

+0

不,级联都会将删除命令级联到项目。不需要手动去做 – Firo

+0

很酷。完美工作。 –