使用 NHibernate 保留实体的关联对象的策略



我正在研究一个相当大的应用程序,该应用程序试图遵循分层体系结构模式。在DBAL上,我使用流利的配置NHIBERNATE。数据库对象有时具有类似的关联:

public class HeaderDbo
{
    public HeaderDbo()
    {
        Details = new List<DetailDbo>();
    }
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<DetailDbo> Details { get; set; }
}
public class DetailDbo
{
    public virtual int Id { get; set; }
    public virtual string DetailName { get; set; }
    public virtual HeaderDbo Header { get; set; }
    public virtual RelevantObjectDbo RelevantObject { get; set; }
}
public class RelevantObjectDbo
{
    public virtual int Id { get; set; }
    public virtual string RelevantText { get; set; }
}

映射如下:

public class HeaderDboMap : ClassMap<HeaderDbo>
{
    public HeaderDboMap()
    {
        Table("Header");
        Id(x => x.Id).Column("Id");
        Map(x => x.Name);
        HasMany(x => x.Details)
            .Inverse()
            .Cascade.All();
    }
}
public class DetailDboMap : ClassMap<DetailDbo>
{
    public DetailDboMap()
    {
        Id(x => x.Id).Column("Id");
        Table("Detail");
        Map(x => x.DetailName);
        References(x => x.Header).Column("HeaderId");
        References(x => x.RelevantObject).Column("RelevantObjectId")
            .Cascade.SaveUpdate();  //??
    }
}
public class RelevantObjectDboMap : ClassMap<RelevantObjectDbo>
{
    public RelevantObjectDboMap()
    {
        Id(x => x.Id).Column("Id");
        Table("RelevantObject");
        Map(x => x.RelevantText);
    }
}

现在,有一些应用程序域实体将DBO映射到不一定反映数据库结构一对一的情况下。例如,标题可能会留在标题中,但是细节会从详细信息和相关部分的部分形成。然后,应用程序对实体进行了操作 - 细节的某些转换现在需要持续。

假设我仅影响需要进入细节表的细节实体的部分,并且不会以任何方式影响相关的对象表。考虑模型可能是错误的方法,但我们还需要对持续性的工作方式进行实用。因此,例如,我只想让NHIBERNATE更新细节表,而不会"触摸"相关对象表上的任何内容。实际上,这正是问题:我该如何实现?

实际上,当然,数据库模型更大,更复杂,应用逻辑也更加复杂。BL的一部分可能根本无法处理数据的相关部分,因此,即使DBO完全从DB加载,并非所有数据都可以进入应用程序模型。但是要将数据持续到数据库中 - 似乎我需要充分补充数据库模型,并且并不总是实用的。那么,我们如何指示nhibernate"不触摸"相关对象 - 换句话说,不更新dbo.detail.relevantobjectid?

我尝试将不同的级联选项应用于detaildbo.relelevantobject属性,但是如果它留在null,则nhibernate始终希望将相关的对象设置为null-我想是这样。

我不明白如何编写与我的BL的"部分"相关的数据更改,而无需加载并保存一半的数据库。

谢谢!

您如何执行这些更新?如果您没有修改RelevantObject NHIBERNATE上的任何内容,则不会发送该表的更新。例如:

var header = session.Get<HeaderDbo>(1);
header.Details.First().DetailName = "Whatever";
session.Flush();

不应导致更新发给RelevantObject表。

相关内容

  • 没有找到相关文章

最新更新