信息: 有一個組對象。用戶可以被邀請參加組。有兩種類型的組邀請:外部和內部。所有邀請都使用鑑別器存儲在單個表中。組對象只知道內部邀請。NHibernate:如何根據鑑別器類型過濾映射集合
問題在Invite表中有兩條記錄。一個用於內部,一個用於外部。如果我加載組,我會看到兩個邀請,即使集合是InternalInvite類型。 。
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);
}
}
這應該工作。請發佈訪問集合時執行的SQL查詢。 – cremor
我在上面的問題中添加了SQL查詢。 – mynkow