如何在nhibernate中实现导航属性

本文关键字:实现 导航 属性 nhibernate | 更新日期: 2023-09-27 17:51:19

我有一个使用NHibernate的域模型的场景,它看起来像下面这样。

public class BaseClass
{
  public virtual int Id { get; set; }
  public virtual string SomeProperty { get; set; }
}
public class FirstClass : BaseClass 
{
  public virtual IList<AnotherClass> AnotherClassList  { get; set; }
}
public class SecondClass : BaseClass 
{
  public virtual AnotherClass AnotherClass  { get; set; }
}
public class AnotherClass 
{
  public virtual int Id { get; set; }
  public virtual BaseClass MyNavigationalProperty  { get; set; }
}

它看起来不错,但它不工作,因为我期待它会做。

作为我的第一步我在列表中保存了一个或多个AnotherClass的FirstClass,它工作得很好。我可以在列表中检索FirstClass和相关的AnotherClasses。

在我的第二步我单独保存一个新的AnotherClass,并从我的第一步设置MyNavigationalProperty到我的FirstClass。它看起来很棒,但是…

在我的最后一步我正在检索我的FirstClass,我期待我的AnotherClassList包含我的第二步的AnotherClass。但是我只从我的第一步得到原来的AnotherClasses。

查看数据库,我可以看到从我的第二步的记录,但有两个单独的fk表AnotherClass, BaseClass_Id和FirstClass_Id, FirstClass_Id是NULL,因此我没有得到这个记录在我的最后一步。

这是实现导航属性的错误方式吗?如果是这样,我该怎么做呢?还是……简单地说,有没有更好的方法来做到这一点?

编辑

从Thilak的映射问题我得到了另一个想法,原来的领域模型没有使用BaseClass,这是我的实现。这样就有必要创建我自己的映射吗?这是否意味着我必须完全放弃自动映射?

如何在nhibernate中实现导航属性

引用使用另一列作为集合。你可以手动重写

class SetForeignKeyColumn : IAutomappingOverride<FirstClass>
{
    public ...
    {
        instance.HasMany(x => x.AnotherClassList).KeyColumn("baseclass_id");
    }
}