2016-04-05 5 views
0

私は多くのソースを含む多くのレポート(1対多)を含むEventという名前のエンティティを持っています。NHibernate - 更新する必要のないエンティティを更新しようとしました

イベントを更新しようとしているときに、カスケード(これは問題ありません)のためにレポートを更新しようとします。 更新しようとしますカスケード(これは問題ありません)のためにレポートのソースは結合テーブルにありますが、なんらかの理由でSourceエンティティを更新しようとしますが、ソースエンティティは更新されません。

public class Event 
{ 
    public virtual IList<Report> Reports { get; set; } 
    public virutal int Id { get; set; } 
    public Event() 
    { 
     Reports = new List<Report>(); 
    } 
} 

public class EventMapping : ClassMap<Event> 
{ 
    public EventMapping() 
    { 
     Table("EVENTS"); 
     Id(x => x.Id).Column("ID").GeneratedBy.Sequence("EVENT_ID_SEQ"); 

     HasMany(x => x.Reports).KeyCoulmn("EVENT_ID").Cascade.SaveUpdate(); 
    } 
} 

public class Report 
{ 
    public virtual int Id { get; set; } 
    public virtual int Status { get; set; } 
    public virtual IList<Source> Sources { get; set; } 

    public Report() 
    { 
     Sources = new List<Source>(); 
    } 
} 

public class ReportMapping : ClassMap<Report> 
{ 
    public ReportMapping() 
    { 
     Table("REPORTS"); 
     Id(x => x.Id).Column("ID").GeneratedBy.Sequence("DIVUACH_ID_SEQ"); 
     Map(x => x.Status).Column("Status"); 
     HasManyToMany(x => x.Sources).Table("SOURCES_IN_REPORT").ParentKeyColumn("REPORT_ID").ChildKeyColumn("KOD_SOURCE").Cascade.All(); 
    } 
} 

public class Source 
{ 
    public virtual int Id { get; set; } 
} 

public class SourceMapping : ClassMap<Source> 
{ 
    public SourceMapping() 
    { 
     Table("SOURCE"); 
     Id(x => x.Id).Column("ID"); 
    } 
} 

ここで私はそれが失敗したときです。

var eventFromDb = _session.Get<Event>(eventId); 

eventFromDb.Reports.ToList().ForEach(x => x.Status = GetStatus()); 

_session.Update(eventFromDb); 

+0

'Source'にはさらにフィールドがありますか? –

答えて

0

通常、望ましくない更新は、誤ったプロパティの変更によるものです。 NHibernateは自動的に変更の追跡を行い、ロード時に割り当てられたものと全く同じ値をプロパティが返さない場合にすべてのレコードを更新します。

はこの答えを参照してください:ところで

を、あなたはupdate()を呼び出す必要はありません。 NHibernateは、セッション中に変更されたエンティティを更新します。データベースからロードしたすべてのもの(例:session.get())がセッションに含まれています。トランザクションをコミットするだけです。

+1

小さな補完:私が見た最も一般的なファントムの更新は、ヌル入力可能なプロパティを持っているエンティティと、対応するDBの列がヌル可能でヌルであるためです。これにより、オブジェクトのプロパティはdbから取得された値と異なる値になります。だからNHibernateはそれが汚いと見なします。 –

関連する問題