我使用流利的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
我原以为课程对象是空的还是空的。并不是说它会有一些代理,所有属性都会抛出异常。
修改
我找到了这个帖子,但我不再拥有这个属性,所以也许他们摆脱它或移动它。
有人知道吗?
答案 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约束会很有帮助。