gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:41:53 25 4
gpt4 key购买 nike

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

最佳答案

根据要求,以下是我最终处理此问题的方式。我实际上使用了@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 提到的,我可以使用投影;然而,我的所有引用列表都通过一个公共(public)端点访问,以便抽象它们的 CRUD 操作并减少重复代码的数量:我的所有引用列表都实现了一个名为 ReferenceListBase 的抽象类。无论如何,我想要一个解决方案,其中实现类本身能够决定应将多少内容发送给客户端(序列化)。

我的解决方案是放一个 [ JsonIgnore ] Parents 集合上的属性,与延迟加载一起,意味着 JSON.NET 从不查看属性,因此永远不会加载关系。

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

关于C# NHibernate - 在删除时删除对对象的所有引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38702042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com