所以我有一个名为Event的实体,其中包含许多报告(一对多),其中包含许多来源(多对多)。
我遇到了一个我无法弄清楚的问题,当我试图更新我的事件时,它会尝试更新报告,因为级联(很好) 由于级联(这很好),它会尝试更新连接表上的报告源,但由于某种原因,它还会尝试更新源实体,因为它没有变化,所以它不应该更新。
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 :(得分:0)
不需要的更新通常会导致属性的意外更改。当属性没有返回加载时分配给它的完全相同的值时,NHibernate具有自动更改跟踪并更新所有记录。
看到这个答案:
update()
。无论如何,NHibernate在会话中更新实体。您从数据库加载的所有内容(例如,在您的案例中由session.get()
加载)都在会话中。只需提交交易。