我有两个对象。其中一个是父级,它引用了一个Locale。此区域设置来自区域设置列表。删除该语言环境时,我希望它从所有引用类型中清除对自身的任何引用(将相关值设置为null)。
现在,我有一个系统遍历NHibernate映射的所有实体,并通过使用其类元数据确定哪些类型引用了语言环境类型。然后,我为该引用类型构建一个查询(使用ICriteria),其中Locale类型的属性等于我正在尝试删除的语言环境ID。回来的任何对象,我将该属性设置为null,然后更新它们。
问题:有没有更好的方法 - 希望使用NHibernate内置的东西 - 指示对象在删除时删除对自身的所有引用?
物件:
public class Parent
{
public virtual Guid Id { get; set; }
public virtual Locale Loc { get; set; }
}
public class Locale
{
public virtual Guid Id { get; set; }
}
映射:
public class ParentMapping : ClassMap<Parent>
{
Id(x => x.Id).GeneratedBy.Guid();
References(x => x.Loc).Nullable();
}
public class LocaleMapping : ClassMap<Locale>
{
Id(x => x.Id).GeneratedBy.Guid();
}
答案 0 :(得分:1)
根据要求,这是我如何处理这个问题。我实际上使用了@Fran最初给出的建议来提出解决方案。
<强>解决方案强>
此解决方案非常适合我的应用程序类型,并且涉及使用应用程序的许多部分协同工作以实现我想要的结果。具体来说,我的应用程序是一个RESTful Web服务,由WCF,JSON.NET和NHibernate提供支持。
首先,我添加了对语言环境中所有父项的引用,并使用了HasMany映射,以便语言环境知道引用它的所有父项:
public virtual IList<Parent> Parents { get; set; }
和
HasMany(x => x.Parents);
在此指出我在整个应用程序中使用延迟加载也很重要。
虽然这允许我通过使用适当的级联行为轻松删除语言环境,但这在加载/ GET场景中提出了一个问题,因为当我将语言环境传递到JSON.NET时(在通往客户端的大门之外) ,JSON.NET将走向Parents集合,并序列化整个事物。显然,这是不受欢迎的,因为我们为客户提供的食物比他们要求的要多得多。这是我在OP的评论中提到的问题。
正如@Fran所说,我可以使用预测;但是,我的所有引用列表都是通过公共端点访问的,以便抽象它们的CRUD操作并减少重复代码的数量:我的所有引用列表都实现了一个名为ReferenceListBase的抽象类。无论如何,我想要一个解决方案,其中实现类本身能够决定应该将多少内容发送到客户端(序列化)。
我的解决方案是在Parents集合上放置一个[JsonIgnore]属性,与延迟加载一起,意味着JSON.NET从不查看属性,因此,关系永远不会被加载。< / p>
这个解决方案总是让人感觉像是一个黑客,但它已经实现了我想要的所有结果,并且非常容易添加新的参考列表。我希望这可以帮助你;如果没有,请发布一个新问题,将其链接到此处,我会尽力帮助您。 :)