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
,而不是從數據庫延遲加載該實體。這可以做到,如果是這樣,怎麼做?
問題是我需要的任務編號無處不在。我會嘗試使用這種映射技術,也許爲TaskId創建一個自定義getter屬性,而不必一直輸入'app.Task.Id'。 – 2015-04-01 16:29:56
@GregBurghardt「app.Task.Id」vs「app.TaskId」真的有什麼不同嗎?我們通過這樣的關係在我們的代碼中處處做到這一點。也是這樣,你不必對同一件事物進行雙重映射。 – 2015-04-01 17:04:21
我明白我現在做錯了什麼。起初我沒有去尋找這個解決方案,因爲通常我會直接調用方法或屬性而不是對象的屬性,因爲這會創建更容易重構的代碼。我以爲只是包括一個'公共字符串TaskId {得到{返回Task.Id; }}'Application'類中的委託屬性將映射關閉,但我在'QueryOver'調用中使用了'TaskId'委託屬性。 _這是搞砸了NHibernate。我需要'session.QueryOver().Where(app => app.Task.Id ==「...」)''。 –
2015-04-02 12:50:53