如何在NHibernate中设置非外键约束?

如何在NHibernate中设置非外键约束?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在使用fluent nhibernate(v1.2)和nhibernate(v3.1),我遇到了一个奇怪的问题 我有这个 public class GradeMap : ClassMap<Grade> { public GradeMap() { Id(x => x.GradeId); Map(x => x.TaskName).NvarcharWithMaxSize().Not.Nullable();

我正在使用fluent 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();
    }
}
我本以为Course对象是空的或空的。并不是说它会有一个所有属性都抛出异常的代理

编辑

我找到了这个帖子,但是我已经没有这个属性了,所以他们可能已经把它扔掉了或者把它移走了

有人知道吗

我认为这里的错误是因为您正在访问一个不存在的对象的Id属性。
如果执行
TableA.TableB
,是否会出现相同的错误?

那么NotFound.Ignore()呢

若“课程id”列上并没有外键约束,那个么可以删除课程表中包含课程id的行,该行对应于成绩表中的“课程id”列。例如:

Course table:
CourseId    Prefix
1           Course1Prefix

Grade table:
GradeId     TaskName    Course_id
1           Grade1Task  1
如果没有外键约束,您可以发出此dml查询:

delete from Course where CourseId = 1
这可能是Sjonny解释的问题的原因

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

session.Query<Grade>().ToList();
session.Query().ToList();
不生成任何代理,当在数据库中找不到grade引用的课程时,课程属性仅为null


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

您对TableA.TableB是什么意思?如果您查看TableA对象中的TableB,它会显示“Castle.Proxy”或类似的内容(当您深入查看每个属性时,它们都会显示该错误)。这就是为什么我希望它为null或其他什么。从那时起,我可以对TAbleA中的TableB对象执行null检查,而不执行查询。我相信它会显示“Castle.Proxy”等。因为默认情况下该属性是延迟加载的,所以可能(这只是猜测)nHibernate不知道实际上没有对应的TableB。然后,当您使用“TableA.TableB.Id”访问它时,TableB对象被加载(并计算为null),然后您会得到一个null引用异常。这实际上似乎是合理的。如果你尝试“If(TableA.TableB==null)”你会得到什么?TableA.TableB(Grade.Course)==null将计算为“false”,这是正确的,我同意Sjonny。当TableA.TableB(Grade.Course)数据库表中没有相应的行时,仍会创建TableA.TableB(Grade.Course)属性的代理,并且该属性不为null(但不会从数据库中加载任何内容)。如果您试图通过调试器访问TableA.TableB(Grade.Course)中的任何属性,则NH尝试从数据库加载代理,但失败(不存在与代理对应的行),您将看到提到的异常。请显示TableA和TableB的完整映射,例如,Id映射很有趣。您使用什么版本的NH和FNH?“如果我做这个表格A.TableB.Id…”是什么意思?是的,我也发现了,但它并没有解决我手头的问题。很高兴知道。我不确定Nullable()在引用上的作用,因为我尝试过,但没有太大帮助。默认情况下,引用是可以为null的。您使用什么版本的NH和FNH?
Grade(GradeId, TaskName, Course_id)
Course(CourseId, Prefix)
Course table:
CourseId    Prefix
1           Course1Prefix

Grade table:
GradeId     TaskName    Course_id
1           Grade1Task  1
delete from Course where CourseId = 1
session.Query<Grade>().ToList();