2011-11-17 132 views
2

信息: 有一個組對象。用戶可以被邀請參加組。有兩種類型的組邀請:外部和內部。所有邀請都使用鑑別器存儲在單個表中。組對象只知道內部邀請。NHibernate:如何根據鑑別器類型過濾映射集合

問題在Invite表中有兩條記錄。一個用於內部,一個用於外部。如果我加載組,我會看到兩個邀請,即使集合是InternalInvite類型。 InternalInvite result

SELECT internalin0_.Group_id as Group3_1_, 
    internalin0_.Id  as Id1_, 
    internalin0_.Id  as Id0_0_, 
    internalin0_.Group_id as Group3_0_0_, 
    internalin0_.User_id as User5_0_0_ 

FROM [AbstractInvite] internalin0_ WHERE internalin0_.Group_id = 'be60b160-659e-4157-b033-9f9e00e346c7'

當我改變的ISet集合類型到AbstractInvite它會加載所有邀請具有正確類型。

問題如何將collection屬性映射到InternalInvites?

我會盡量儘量減少代碼。

的組並且對該組映射:

public class Group 
{ 
    public Group() 
    { 
     InternalInvitations = new HashedSet<InternalInvite>(); 
    } 
    public virtual Guid Id { get; set; } 
    public virtual ISet<InternalInvite> InternalInvitations { get; set; } 
} 

public class GroupMap : ClassMap<Group> 
{ 
    public GroupMap() 
    { 
     Id(x => x.Id); 
     HasMany(x => x.InternalInvitations).Inverse(); 
    } 
} 

內部和外部邀請+映射:

public abstract class AbstractInvite 
{ 
    public virtual Guid Id { get; set; } 
    public virtual Group Group { get; set; } 
} 

public class ExternalInvite : AbstractInvite 
{ 
    public virtual string Name { get; set; }  
} 

public class InternalInvite : AbstractInvite 
{ 
    public virtual User User { get; set; } 
} 

public class AbstractInviteMap : ClassMap<AbstractInvite> 
{ 
    public AbstractInviteMap() 
    { 
     Id(x => x.Id); 
     References(x => x.Group); 
     DiscriminateSubClassesOnColumn("type"); 
    } 
} 

public class ExternalInviteMap : SubclassMap<ExternalInvite> 
{ 
    public ExternalInviteMap() 
    { 
     Map(x => x.Name); 
    } 
} 

public class InternalInviteMap : SubclassMap<InternalInvite> 
{ 
    public InternalInviteMap() 
    { 
     References(x => x.User); 
    } 
} 
+0

這應該工作。請發佈訪問集合時執行的SQL查詢。 – cremor

+0

我在上面的問題中添加了SQL查詢。 – mynkow

回答

1

了一個quickfix /解決方法是

HasMany(x => x.InternalInvitations).Inverse().Where("type = 'Namespace.InternalInviteMap'"); 
+0

這是我目前的設置。 where子句現在工作得很好,但我認爲這是不正確的。 – mynkow

+0

沒錯,看起來像是一個bug – Firo

相關問題