2016-08-01 104 views
2

我有两个对象。其中一位父母引用了Locale。此语言环境来自语言环境列表。当该语言环境被删除时,我希望它从所有引用类型中清除对自身的任何引用(将相关值设置为空)。C#NHibernate - 删除所有对删除对象的引用

现在,我有一个系统遍历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

我认为你映射是错误的。两者都映射到。此关系中的小p父母是Locale。在映射中,引用是多对一的映射,其中语言环境是一个映射。你有没有想过如何使映射双向回到Locale?设置关系的级联。 – Fran

+0

我很抱歉。我知道我会在某个地方犯一个错字。我纠正了它。它应该是'LocaleMapping:ClassMap '。当你说双向时,你的意思是地区实体了解所有拥有它的父母,对吗? –

+0

因为我知道所有拥有它的父母的地方实体,我避而远之的原因是它很难仅加载没有所有其他信息的Locale。我希望区域设置尽可能干净。 –

回答

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将走亲爱集合,并序列化整个事情。很明显,这是不受欢迎的,因为我们比客户要求的要多得多。这是我在OP的评论中提到的问题。

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

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

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