NHibernate-尝试更新不需要更新的实体
本文关键字:更新 实体 不需要 NHibernate- | 更新日期: 2024-06-14 08:46:19
所以我有一个名为Event的实体,它包含许多报告(一对多),其中包含许多源(多对多)。
我正面临一个我无法解决的问题,当我试图更新我的事件时,它会因为级联而尝试更新报告(这很好)并且由于级联(这很好),它将尝试更新联接表上的报表源,但出于某种原因,它也尝试更新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);
知道为什么吗?
不需要的更新通常是由于属性的意外更改。NHibernate具有自动更改跟踪功能,当属性没有返回与加载时分配给它的值完全相同的值时,它会更新所有记录。
请参阅以下答案:
- 为什么hibernate总是调用";"更新";使用";选择";MySQL中的语句
- Nhibernate在选择时进行更新
顺便说一下,您不需要调用update()
。NHibernate在会话中更新已更改的实体。您从数据库加载的所有内容(例如,在您的情况下通过session.get()
)都在会话中。只需提交事务。