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

C#NHibernate-删除对对象的所有引用,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有两个目标。一个是父级,引用区域设置。此区域设置来自区域设置列表。删除该区域设置后,我希望它清除所有引用类型中对自身的任何引用(将相关值设置为null) 现在,我有一个系统,它遍历NHibernate映射的所有实体,并通过使用它们的类元数据确定哪些类型引用区域设置类型。然后,我为引用类型构建一个查询(使用ICriteria),其中类型Locale的属性等于我试图删除的区域设置的Id。任何返回的对象,我都将该属性设置为null,然后更新它们 问题:是否有更好的方法(希望使用NHibernate内

我有两个目标。一个是父级,引用区域设置。此区域设置来自区域设置列表。删除该区域设置后,我希望它清除所有引用类型中对自身的任何引用(将相关值设置为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();
}
映射:

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();
}
公共类父映射:类映射
{
Id(x=>x.Id).GeneratedBy.Guid();
引用(x=>x.Loc).Nullable();
}
公共类LocaleMapping:ClassMap
{
Id(x=>x.Id).GeneratedBy.Guid();
}

根据要求,下面是我如何处理这个问题的。实际上,我使用了@Fran最初给出的一个建议来提出一个解决方案

解决方案

此解决方案非常特定于我的应用程序类型,涉及到使用应用程序的多个部分协同工作以实现我所期望的结果。具体来说,我的应用程序是一个RESTful web服务,由WCF、JSON.NET和NHibernate提供支持

首先,我添加了对区域设置中所有父对象的引用,并使用了HasMany映射,以便区域设置知道引用它的所有父对象:

public virtual IList<Parent> Parents { get; set; }
这里还必须指出,我在整个应用程序中使用延迟加载

虽然这使我可以通过使用适当的级联行为轻松删除区域设置,但这在加载/获取场景时带来了一个问题,因为当我将区域设置传递到JSON.NET(在它离开客户端时),JSON.NET将遍历父集合,并序列化整件事情。显然,这是不希望的,因为我们给客户的食物远远超过了他们的要求。这就是我在评论中提到的问题

正如@Fran提到的,我可以使用投影;但是,我的所有引用列表都是通过一个公共端点访问的,以便抽象它们的CRUD操作并减少重复代码的数量:我的所有引用列表都实现了一个名为ReferenceListBase的抽象类。无论如何,我想要一个解决方案,在这个解决方案中,实现类本身能够决定应该将多少内容发送给客户机(序列化)

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


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

我认为你的映射是错误的。两者都映射到。此外,此关系中的小p父项是区域设置。从映射中,引用是多对一映射,其中Locale是一个。您是否考虑过将映射双向返回到区域设置?我为你们的关系道歉。我知道我会在某个地方打字。我已经改正了。它应该是
LocaleMapping:ClassMap
。当你说双向时,你指的是区域设置实体知道所有拥有它的父对象,对吗?我回避区域设置实体了解所有拥有它的父对象的原因是,这样很难在没有所有其他信息的情况下只加载区域设置。我希望区域设置尽可能干净。您能否澄清“很难只加载区域设置?”您是否加载区域设置以在屏幕中编辑它?您是否正在对区域设置进行其他处理?我倾向于在获取特定实体的信息时使用投影。这确保了当您只需要一个实体时,不会加载整个对象层次结构。@DanielAtwood,您是如何解决这个问题的?我也有类似的问题。