2015-04-01 59 views
0

我有NHibernate的兩個實體之間的一對多的關係:如何啓用關係的延遲加載INSERT後NHibernate的

public class Application 
{ 
    public string TaskId { get; set; } // Foreign key reference 
    public Task Task { get; set; }  // The relation/navigation property 
} 

db.Web.Applications.Create方法只是調用NHibernate會話的「SaveOrUpdate」法內交易。

的初步認識映射:

internal class ApplicationMap : ClassMap<Application> 
{ 
    public ApplicationMap() : base() 
    { 
     Schema(...); 
     Table(...); 

     CompositeId() 
      .KeyProperty(app => app.UserId, "...") 
      .KeyProperty(app => app.TaskId, "task_id") 
      .KeyProperty(app => app.TransactionId, "..."); 

     // Relations 

     References(app => app.Task, "task_id") 
      .ForeignKey("taskid") 
      .Unique() 
      .Not.Insert() 
      .Cascade.Persist(); 
    } 
} 

internal class TaskMap : ClassMap<Task> 
{ 
    public TaskMap() 
    { 
     Schema(..); 
     Table(...); 

     Id(task => task.Id, "task_id"); 

     HasMany(task => task.Applications) 
      .KeyColumn("task_id"); 
    } 
} 

當我寫了一個測試對一個真正的數據庫中創建一個新的Application我發現導航屬性不是插入後延遲加載:

var app = new Application(...) 
{ 
    TaskId = "..." 
}; 

db.Web.Applications.Create(app); 
db.SaveChanges(); 

var actual = db.Web.Applications.Find(app.UserId, app.TaskId, app.TransactionId); 

// actual.Task is null 

的映射按我期望的方式工作,但在插入新的Application對象後,訪問Task屬性返回null,而不是從數據庫延遲加載該實體。這可以做到,如果是這樣,怎麼做?

回答

1

我認爲你的問題出現在你已經映射Application類的方式以及它對應的Task對象關係中。我想你應該像這樣映射它:

​​

沒有必要爲外鍵關係映射特定的id屬性。我總是隻映射實體。這種方式更容易。那麼你上面的代碼插入將是這樣的:

var app = new Application(...) 
{ 
    Task = session.Load<Task>(taskId) 
}; 

db.Web.Applications.Create(app); 
db.SaveChanges(); 

var actual = db.Web.Applications.Find(app.UserId, app.TaskId, app.TransactionId); 
+0

問題是我需要的任務編號無處不在。我會嘗試使用這種映射技術,也許爲TaskId創建一個自定義getter屬性,而不必一直輸入'app.Task.Id'。 – 2015-04-01 16:29:56

+0

@GregBurghardt「app.Task.Id」vs「app.TaskId」真的有什麼不同嗎?我們通過這樣的關係在我們的代碼中處處做到這一點。也是這樣,你不必對同一件事物進行雙重映射。 – 2015-04-01 17:04:21

+0

我明白我現在做錯了什麼。起初我沒有去尋找這個解決方案,因爲通常我會直接調用方法或屬性而不是對象的屬性,因爲這會創建更容易重構的代碼。我以爲只是包括一個'公共字符串TaskId {得到{返回Task.Id; }}'Application'類中的委託屬性將映射關閉,但我在'QueryOver'調用中使用了'TaskId'委託屬性。 _這是搞砸了NHibernate。我需要'session.QueryOver ().Where(app => app.Task.Id ==「...」)''。 – 2015-04-02 12:50:53