我擁有包含對象列表的對象。nhibernate。在同一會話中創建袋後爲空
public class Product: IProduct
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<IFunction> Functions { get; set; }
}
public class Function : IFunction
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
public virtual IProduct Product { get; set; }
}
映射對象的列表(IList的<■功能>):
<bag name="Functions" cascade="all" table="T_WEBFUNCTIONS" lazy="false">
<key column="PRODUCT_ID" />
<one-to-many class="Function" />
</bag>
代碼:
我嘗試建立產品
public IProduct SetProduct(string productName)
{
// Product repository, which have nhibernate opened session (ISession)
IDBRepository<IProduct> rep = Repository.Get<IProduct>();
// Create new object of product
rep.Create(new Product() { Name = productName });
// get created object by name
prod = rep.Query().Where(x => x.Name == productName).SingleOrDefault();
// I HAVE ISSUE HERE
// prod.Functions == NULL. It must be a new List<Function>()
// Nhibernate don't create empty list for me and this property always null
return prod;
}
而是一個新的對象。當nhibernate會話關閉並再次打開時,該列表將被創建並且有0個項目。
如果我在同一個會話中創建一個對象(產品)並在創建後得到它,bag將爲空。數據倉庫
public class DBRepository<T> : IDBRepository<T>
{
protected ISession CurrentSession;
public DBRepository(ISession session)
{
CurrentSession = session;
}
public void Create(T obj)
{
var tmp = CurrentSession.BeginTransaction();
CurrentSession.Save(obj);
tmp.Commit();
}
}
THX。這有所幫助。嘗試使用表達式'rep.Create(new Product(){Name = productName,Functions = new List()})'。工作得很好 –
Kronos
不用擔心。 絕對比使用'函數=新列表()'更好,而不是改變! 剛纔我發現「跳過從數據庫中獲取實體」在某些情況下是正確的,但在這裏不是。 在這種情況下,信息已經從數據庫中檢索出來(這取決於在存儲庫上完成的查詢),所以保存的是NHibernate重新構建對象。 –
Jonno