NHibernate - 尝试更新不需要更新的实体

时间:2016-04-05 09:29:23

标签: c# nhibernate fluent-nhibernate cascade jointable

所以我有一个名为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);

知道为什么吗?

1 个答案:

答案 0 :(得分:0)

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

看到这个答案:

顺便说一句,你不需要拨打update()。无论如何,NHibernate在会话中更新实体。您从数据库加载的所有内容(例如,在您的案例中由session.get()加载)都在会话中。只需提交交易。