2011-05-08 43 views
0

我使用流利的nhibernate(v1.2)和nhibernate(v3.1),我有一個奇怪的問題。如何在NHibernate中創建非外鍵約束?

我有這個

 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?

+0

請問您能否顯示TableA和TableB的完整映射,例如Id映射很有趣。你使用什麼版本的NH和FNH?這是什麼意思「如果我做這個TableA.TableB.Id ...」? – 2011-05-09 18:56:01

+0

@Jakub Linhart - 更新。 – chobo2 2011-05-09 19:08:01

回答

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列的外鍵約束,則排在CourseId課程表對應的檔次COURSE_ID列表可以被刪除。例如: -

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約束會很有幫助。

+0

雅我發現,但它並沒有解決我手頭的問題。很高興知道。我不確定Nullable()是什麼,然後在參考文獻中,因爲我嘗試過,並沒有太大的幫助。 – chobo2 2011-05-14 18:00:51

+0

引用默認爲空。你使用什麼版本的NH和FNH? – 2011-05-14 18:03:07

+0

NH 3.1和FNH 1.2 – chobo2 2011-05-14 18:33:12

1

認爲在這裏的錯誤是因爲你所訪問的對象不存在的ID屬性。
如果你這樣做了,你會得到同樣的錯誤嗎?

+0

你是什麼意思與表A.表B?如果您查看TableA對象中的TableB,它會說「Castle.Proxy」或沿着這些行的東西(當您向下鑽取每個屬性時會出現該錯誤)。這就是爲什麼我期望它是空的或什麼的。從那時起,我可以對TAbleA中的TableB對象進行空檢查,而不是執行查詢。 – chobo2 2011-05-09 15:45:55

+0

我相信它說'Castle.Proxy'等,因爲屬性是默認加載的,所以也許(這只是一個猜測)nHibernate不知道實際上沒有相應的TableB。那麼當你用'TableA.TableB.Id'訪問它時,TableB對象被加載(並且評估爲null),然後你得到一個空引用異常。這實際上似乎是爲了。如果你嘗試'if(TableA.TableB == null)',你會得到什麼? – 2011-05-09 23:21:17

+0

TableA.TableB(Grade.Course)== null將評​​估爲「false」 – chobo2 2011-05-09 23:28:21