我正在研究一个相当大的应用程序,该应用程序试图遵循分层体系结构模式。在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
表。