C#NHibernate - 删除对删除对象的所有引用

时间:2016-08-01 14:56:55

标签: c# nhibernate fluent-nhibernate

我有两个对象。其中一个是父级,它引用了一个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();
}

1 个答案:

答案 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>

这个解决方案总是让人感觉像是一个黑客,但它已经实现了我想要的所有结果,并且非常容易添加新的参考列表。我希望这可以帮助你;如果没有,请发布一个新问题,将其链接到此处,我会尽力帮助您。 :)