2012-04-14 66 views
0

我有以下代碼:FluentNHibernate - 級聯插入

// setup 
    var sessionFactory = SessionManager.CreateSessionFactory(true); 

    // business 
    using (var session = sessionFactory.OpenSession()) 
    { 
    using (var tran = session.BeginTransaction()) 
    { 
     var user1 = new UserDto() {Email = "[email protected]", FirstName = "FN1", LastName = "LN1"}; 
     var user2 = new UserDto() {Email = "[email protected]", FirstName = "FN2", LastName = "LN2"}; 

     var projType1 = new ProjectTypeDto() {ProjectTypeName = "ptn1", ProjectTypeDescription = "ptd1"}; 

     var timeSheet1 = new TimeSheetDto(){ Comment = "c1", User = user1, ProjectType = projType1 }; 
     var timeSheet2 = new TimeSheetDto(){ Comment = "c2", User = user2, ProjectType = projType1 }; 

     session.SaveOrUpdate(timeSheet1); 
     session.SaveOrUpdate(timeSheet2); 

     tran.Commit(); 
    } 
    } 

它打破了 「tran.Commit();」線。

異常說timeSheet是指不存在的用戶。 (很明顯)

如何使它自動添加所有相關的對象?

我使用下面的映射:

public class TimeSheetMap : ClassMap<TimeSheetDto> 
    { 
    public TimeSheetMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.StartTime); 
     Map(x => x.EndTime); 
     Map(x => x.Comment); 
     References(x => x.User).Cascade.All(); 
     References(x => x.ProjectType).Cascade.All(); 
    } 
    } 
+0

它應該工作,顯示一個UserDto類映射,爲什麼你不使用session.Save(timeSheet1);?我認爲這個問題可以通過Inverse,但我正在等待你的班級地圖 – 2012-04-14 20:45:33

回答

1

你需要一邊宣稱是使用逆父,否則保存兩側。嘗試將你的時間表映射到:

public class TimeSheetMap : ClassMap<TimeSheetDto> 
    { 
    public TimeSheetMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.StartTime); 
     Map(x => x.EndTime); 
     Map(x => x.Comment); 
     References(x => x.User).Cascade.All().Inverse(); 
     References(x => x.ProjectType).Cascade.All().Inverse(); 
    } 
    }