我有一个与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,这是我的实现。这是否有必要创建我自己的映射?这是否意味着我必须完全放弃自动化?
答案 0 :(得分:1)
引用使用另一列作为集合。你可以手动覆盖它
class SetForeignKeyColumn : IAutomappingOverride<FirstClass>
{
public ...
{
instance.HasMany(x => x.AnotherClassList).KeyColumn("baseclass_id");
}
}