你如何在NHibernate中制作非外键约束?

时间:2011-05-08 23:13:34

标签: nhibernate fluent-nhibernate

我使用流利的nhibernate(v1.2)和nhibernate(v3.1),我遇到了一个奇怪的问题。

我有这个

      public class GradeMap : ClassMap<Grade>
{
    public GradeMap()
    {
        Id(x => x.GradeId);
        Map(x => x.TaskName).NvarcharWithMaxSize().Not.Nullable();
        Map(x => x.Weight).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.OutOf).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.Mark).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.CourseBackgroundColor).Not.Nullable();
        Map(x => x.CoursePrefix).Not.Nullable();
        References(x => x.Student).Not.Nullable();
        References(x => x.Course);
    }
}

public class CourseMap : ClassMap<Course>
{
    public CourseMap()
    {

        Id(x => x.Id).Column("CourseId");
        Map(x => x.Prefix).NvarcharWithMaxSize().Not.Nullable();
        HasMany(x => x.Tasks).Cascade.Delete().Inverse();
        HasMany(x => x.CoursePermissions).Cascade.All().Inverse();
        HasMany(x => x.CourseSharing).Cascade.All().Inverse();
        HasMany(x => x.Grades).Cascade.None().Inverse();
    }
}
然后我做了类似的事情

return session.Query<Grade>().ToList();

如果我试图抓住像Grade.Course.Id这样的问题,它会崩溃,我会得到。

Grade.Course = {Castle.Proxies.CourseProxy}
Grade.Course.Id = '((new System.Collections.Generic.Mscorlib_CollectionDebugView<OnlGrade>(grades)).Items[0].Course).Id' threw an exception of type 'NHibernate.ObjectNotFoundException'
Grade.Course.Prefix = above error except .Prefix instead of .Id

我原以为课程对象是空的还是空的。并不是说它会有一些代理,所有属性都会抛出异常。

修改

我找到了这个帖子,但我不再拥有这个属性,所以也许他们摆脱它或移动它。

有人知道吗?

Is it possible to avoid NHibernate.ObjectNotFoundException when there is a foreign key but the referenced row does not exist?

2 个答案:

答案 0 :(得分:1)

认为这里的错误是因为你正在访问一个不存在的对象的Id属性。
如果你做TableA.TableB,你会得到同样的错误吗?

答案 1 :(得分:0)

NotFound.Ignore()怎么样?

public class GradeMap : ClassMap<Grade>
{
    public GradeMap()
    {
        Id(x => x.GradeId);
        Map(x => x.TaskName).NvarcharWithMaxSize().Not.Nullable();
        Map(x => x.Weight).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.OutOf).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.Mark).Not.Nullable().Precision(5).Scale(2);
        Map(x => x.CourseBackgroundColor).Not.Nullable();
        Map(x => x.CoursePrefix).Not.Nullable();
        References(x => x.Student).Not.Nullable();
        References(x => x.Course)
            .NotFound.Ignore();
    }
}

编辑: 假设数据库模式如下所示:

Grade(GradeId, TaskName, Course_id)
Course(CourseId, Prefix)

如果Course_id列上没有外键约束,则可以删除Course表中具有与Grade表中的Course_id列对应的CourseId的行。 E.g:

Course table:
CourseId    Prefix
1           Course1Prefix

Grade table:
GradeId     TaskName    Course_id
1           Grade1Task  1

没有外键约束,您可以发出此dml查询:

delete from Course where CourseId = 1

这可能是sJhonny解释问题的原因。

当映射中使用“NotFound.Ignore()”时,NHibernate会尝试加载属于查询加载的所有等级的课程:

session.Query<Grade>().ToList();

没有代理生成,并且在数据库中找不到按成绩引用的课程时,Course属性只是null。

如果您可以修改数据库模式,那么在Course_id列上创建PK约束会很有帮助。