2010-04-04 101 views
1

我遇到以下問題。在我的應用程序中使用實體OwnerArea綁定許多。NHibernate與複合元素多對多

public class Area : DomainObject<int> {   
    private ISet<OwnersPeriod> _owners = new HashedSet<OwnersPeriod>(); 

    public ICollection<OwnersPeriod> Owners { 
     get { return _owners; } 
     set { 
      Check.Require(value != null); 
      _owners = new HashedSet<OwnersPeriod>(value); 
     } 
    } 
} 

表Owner2Area具有以下字段:

CREATE TABLE [dbo].[Owner2Area](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [IDOwner] [int] NOT NULL, 
    [IDArea] [int] NOT NULL, 
    [FirstDate] [datetime] NOT NULL, 
    [LastDate] [datetime] NULL, 
CONSTRAINT [PK_Owner2Area] PRIMARY KEY CLUSTERED) 

因此對應於類OwnersPeriod

public class OwnersPeriod { 
     private Owner _member; 
     private Area _area;  
     public Owner Owner { get {...} set{...} }  
     public Area Area { get { ... } set { ... } }  
     public DateTime FirstDate { get; set; }  
     public DateTime? LastDate { get; set; }  
    } 

我寫映射

<class lazy="false" name="Core.Domain.Area, Core" table="Areas"> 
    ... 
    <set name="Owners" table="Owner2Area" inverse="true" lazy="true" > 
     <key column="IDArea"/> 
     <composite-element class="Core.Domain.OwnersPeriod, Core" > 
     <parent name="Area" /> 
     <property name="FirstDate" type="datetime"/> 
     <property name="LastDate" type="datetime"/> 
     <many-to-one name="Owner" class="Core.Domain.Owner, Core" column="IDOwner"/> 
     </composite-element> 
    </set> 
</class> 

對於現有的數據是每個區域SUC合理加載到Owners,但當我在Owner2AreaCreateSQLQuery添加新記錄時,這些數據不會更新區域的實例。如果我重新打開表單並獲得所有區域,則添加鏈接已成功加載到集合中。
如何強制加載,從而記錄關係多對多?
NHibernate的v.2.0.1,DB MSSQL 2005

回答

0

如果使用CreateSQLQuery NHibernate的不知道你做了什麼。試想一下。增加了CreateSQLQuery是因爲HQL和CriteriaQuery並不是所有的東西都是可能的。因此,使用CreateSQLQuery你可以做「特別的事情」。

多對多不被推薦,因爲你沒有'中間表'的'直接處理'。如果你想通過nhibernate的方式(修改一個集合)將一個實體添加到多對多的關係中,然後對實體進行更新,你會發現nhibernate從「中間表」中刪除所有數據,然後插入它再次。所以不好。這就是爲什麼你可能認爲你會使用CreateSQLQuery做一個解決方法。 我建議你做3個實體的經典親子關係,這樣你就可以直接操縱'中間表'。

另一個解決方案是當你更新'中間表'時,你做了一個受到CreateSQLQuery影響的實體的Evict(這是一個ISession的方法和一個在ISessionFactory中的方法,查看手冊)。但使用這將強制另一個命中數據庫(將加載一個新版本)。 使用父子方法不會對數據庫造成衝擊。

+0

謝謝。我注意到NH執行插入和刪除記錄。我添加了一個映射'inverse =「true」',只使用select。 決定與'Evict'做我需要的東西。也許生活並不教我,但多對多的解決方案看起來不錯。 =) – 2010-04-05 20:32:38