1

我有一个与 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; }
}

它看起来不错,但它不像我预期的那样工作。这是我的场景;

作为我的第一步,我将我的 FirstClass 与列表中的一个或多个 AnotherClass 一起保存,它运行良好。我可以用列表中的相关 AnotherClasses 检索我的 FirstClass。

在我的第二步中,我将单独保存一个新的 AnotherClass,并将 MyNavigationalProperty 从我的第一步设置为我的 FirstClass。它看起来确实很棒,但是...

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

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

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

编辑

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

4

1 回答 1

1

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

class SetForeignKeyColumn : IAutomappingOverride<FirstClass>
{
    public ...
    {
        instance.HasMany(x => x.AnotherClassList).KeyColumn("baseclass_id");
    }
}
于 2013-01-23T05:36:51.937 回答