gpt4 book ai didi

nhibernate - 使用 Fluent nHibernate 混合继承和树结构

转载 作者:行者123 更新时间:2023-12-02 05:14:14 25 4
gpt4 key购买 nike

我正在设计的模型的一部分是层次结构地理位置。由于有多个层并共享一些信息,我决定使用这样的类层次结构:

public class GeographicNode
{
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual GeographicNode ParentNode { get; set; }
public virtual IList<GeographicNode> ChildNodes { get; set; }
}


public class Region : GeographicNode
{
public virtual int SomeRegionData { get; set; }
}

public class Country : GeographicNode
{
public virtual int SomeCountryData { get; set; }
}

为了映射这一点,我使用了一个类层次结构表方法。 Fluent nHibernate 映射如下所示:

public class GeographicNodeMap : ClassMap<GeographicNode>
{
public GeographicNodeMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.ParentNode);
HasMany(x => x.ChildNodes).KeyColumn("Id").Cascade.All();

DiscriminateSubClassesOnColumn("Type");
}
}

public class RegionMap : SubclassMap<Region>
{
public RegionMap()
{
Map(x => x.SomeRegionData)
}
}

public class CountryMap : SubclassMap<Region>
{
public CountryMap()
{
Map(x => x.SomeCountryData)
}
}

这是我的问题:

当我获取一个节点并尝试访问 ParentNode(或子节点)时,它的类型实际上是 GeographicNode,而不是相应的子类。因此,例如,如果我得到 Region 节点并且它的父节点应该是 Country 节点,我无法将 ParentNode 转换为 Country 类。

有没有办法强制 nHibernate 用适当的子类实例化 ParentNode 和 Child 对象?此信息存储在 Type 列中,因此 nHibernate 实例化正确的子类似乎是合理的。

在这里使用继承有什么主要问题吗?使用类层次结构减少了代码量(至少在模型中),但我担心这些隐式而不是显式关系(例如,一个地区的父级始终是一个国家)会让我以后遇到麻烦...... .

谢谢!

最佳答案

我在我的博客中写道: http://mikehadlow.blogspot.com/2010/04/nhibernate-get-vs-load-and-sub-types.html

它包括一个特殊的 Cast 函数,可以正确地转换 NHibernate 代理。

但是,最好的解决方案不是强制转换,而是构建正确的多态代码:)

关于nhibernate - 使用 Fluent nHibernate 混合继承和树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2350649/

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