鉴于2个不相关的类,其中一个是其成员 另一个继承层次结构,我如何映射两个接口 这些类让我可以查询界面并拥有 适当的具体类型返回? 例如。
public abstract class Survey
{
public Guid Id { get; private set; }
}
public class InviteOnlySurvey : Survey
{
public ICollection<Invite> Invites { get; private set; }
}
public class Invite : ISurveyGateway
{
public Guid Id { get; private set; }
public InviteOnlySurvey Survey { get; private set; }
}
public class SharedSurvey : Survey, ISurveyGateway { ... }
public interface ISurveyGateway
{
Guid Id { get; }
}
目前我已使用每个类层次结构的表映射Survey,InviteOnlyLiveSurvey和SharedLiveSurvey,现在我正在尝试找出如何映射ISurveyGateway以便我可以查询它并让NHibernate找到匹配的实体(邀请或 SharedLiveSurvey)无缝地。 ISurveyGateway实例是有效的只读,因为所有剩余的持久性问题都是通过SharedSurvey和Invite的映射来管理的。
如果从SharedSurvey或Invite中删除ISurveyGateway接口,我可以通过NHibernate查询和检索ISurveyGateway实例,但是只要我将接口应用于2个不同的层次结构,我就会收到一条消息“为ISurveyGateway实现不明确的持久性”的异常由多个层次结构“(这是预期的 - 我只是不知道如何使它工作)。
答案 0 :(得分:1)
QueryOver和FutureValue的答案有效,但这是一个更简单的解决方案:
public ISurveyGateway FindSurveyGatewayById( Guid id )
{
var surveyGateway = session
.QueryOver<ISurveyGateway>
.Where( s => s.Id == id )
.SingleOrDefault<ISurveyGateway>();
return surveyGateway;
}
但是你应该小心,你的身份证应该是一个Guid。如果情况并非如此,您可能会收到多个回复......
答案 1 :(得分:0)
鉴于Invite和SharedSurvey已经被映射和使用,并且因为ID是Guids,这确保不会有SharedSurvey和Invite具有相同的Id(具有相当高的确定性),我找到了远更简单的方法。
public ISurveyGateway FindSurveyGatewayById( Guid id )
{
var sharedSurveyGateway = session.QueryOver<SharedSurvey>
.Where( s => s.Id == id )
.FutureValue<ISurveyGateway>();
var inviteGateway = session.QueryOver<Invite>
.Where( i => i.Id == id )
.FutureValue<ISurveyGateway>();
return sharedSurveyGateway.Value ?? inviteGateway.Value;
}
这有一些缺点 - 主要的一点是现在必须为添加到系统的每个ISurveyGateway扩展此查询,但是现在它以最低的复杂性和合理的性能完成工作。