2016-04-05 3 views
0

Ich habe also eine Entität namens Event, die viele Berichte enthält (eins zu viele), die viele Quellen (viele zu viele) enthält.NHibernate - Versucht, eine Entität zu aktualisieren, die nicht aktualisiert werden muss

Ich habe ein Problem, das ich gerade nicht herausfinden kann, wenn ich versuche, mein Ereignis zu aktualisieren, wird es versuchen, den Bericht wegen der Kaskade zu aktualisieren (was in Ordnung ist) und es wird versuchen, zu aktualisieren die Quellen des Berichts in der Join-Tabelle wegen der Kaskade (was in Ordnung ist), aber aus irgendeinem Grund versucht sie auch, die Source-Entität zu aktualisieren, die sie nicht aktualisieren sollte, da es keine Änderung darin gibt.

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"); 
    } 
} 

hier ist was ich mache und wenn es scheitert.

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

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

_session.Update(eventFromDb); 

Irgendeine Idee warum?

+0

Haben Sie mehr Felder in 'Source'? –

Antwort

0

Unerwünschte Updates sind in der Regel Ursache versehentlicher Änderungen der Eigenschaften. NHibernate verfügt über eine automatische Änderungsverfolgung und aktualisiert alle Datensätze, wenn die Eigenschaften nicht denselben Wert zurückgeben, der ihm beim Laden zugewiesen wurde.

Sehen Sie diese Antwort:

durch die Art und Weise, die Sie nicht update() rufen müssen. NHibernate aktualisiert geänderte Entitäten trotzdem, wenn sie sich in der Sitzung befinden. Alles, was Sie aus der Datenbank laden (z. B. von session.get() in Ihrem Fall) ist in der Sitzung. Commit einfach die Transaktion.

+1

Kleines Komplement: Die häufigsten Phantomupdates, die ich gesehen habe, waren auf Entitäten mit nicht nullbaren Eigenschaften zurückzuführen, während die entsprechenden Spalten in der DB nullable und null waren. Dies führt dazu, dass die Objekteigenschaften andere Werte haben als die aus db abgerufenen. Daher hält NHibernate es für schmutzig. –

Verwandte Themen