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-尝试更新不需要更新的实体

不需要的更新通常是由于属性的意外更改。NHibernate具有自动更改跟踪功能,当属性没有返回与加载时分配给它的值完全相同的值时,它会更新所有记录。

请参阅以下答案:

  • 为什么hibernate总是调用";"更新";使用";选择";MySQL中的语句
  • Nhibernate在选择时进行更新

顺便说一下,您不需要调用update()。NHibernate在会话中更新已更改的实体。您从数据库加载的所有内容(例如,在您的情况下通过session.get())都在会话中。只需提交事务。