如何在nhibernate中实现导航属性

时间:2013-01-09 23:38:29

标签: c# nhibernate orm fluent-nhibernate

我有一个与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,它完美无缺。我可以使用列表中的相关AnotherClasses检索我的FirstClass。

第二步中,我将另外保存一个新的AnotherClass,并从我的第一步开始将MyNavigationalProperty设置为我的FirstClass。它看起来很棒,但是......

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

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

这是实现导航属性的错误方法吗?如果是这样,我该如何正确地做到这一点?或者......简单地说,有没有更好的方法呢?

修改

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

1 个答案:

答案 0 :(得分:1)

引用使用另一列作为集合。你可以手动覆盖它

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