使用NHibernate在多个层次结构上映射接口

时间:2010-11-15 19:06:31

标签: nhibernate nhibernate-mapping

鉴于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实现不明确的持久性”的异常由多个层次结构“(这是预期的 - 我只是不知道如何使它工作)。

2 个答案:

答案 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扩展此查询,但是现在它以最低的复杂性和合理的性能完成工作。

相关问题