2012-04-02 52 views
0

我有RestorableEnvironmentIBaselineEntity对象之间的1对多的关系:一个给定的RestorableEnvironment将有一个且只有一个IBaselineEntity对象,但每个IBaselineEntity对象可以依赖于0 -n RestorableEnvironment对象。然而,IBaselineEntity以两种方式之一实现:通过文件或通过数据库。我的类(一般),如:NHibernate的:坚持参考与多个Contrete类界面

public interface IBaselineEntity 
{ 
    BaselineImage BuildImage(); 
    //Remainder of interface 
} 

public class BaselineFile : IBaseline 
{ 
    //implementation 
} 

public class BaselineDatabase : IBaseline 
{ 
    //implementation 
} 

public class RestorableEnvironment 
{ 
    public IBaselineEntity BaselineEntity { get; set; } 
    //Remainder of class 
} 

NHibernate的需要在引用语句中的具体落实IBaselineEntity的。为了处理这一点,我已经更新到RestorableEnvironment

public class RestorableEnvironment 
{ 
    public IBaselineEntity BaselineEntity 
    { 
     get { return BaselineDatabase ?? BaselineFile; } 
     set 
     { 
      BaselineFile = value as BaselineFile; 
      BaselineDatabase = value as BaselineDatabase; 
     } 
    } 

    private BaselineFile _baselineFile; 
    public BaselineFile BaselineFile 
    { 
     get { return _baselineFile; } 
     protected set 
     { 
      _baselineFile = value; 
      if (value != null) 
       BaselineDatabase = null; 
     } 
    } 

    private BaselineDatabase _baselineDatabase; 
    public BaselineDatabase BaselineDatabase 
    { 
     get { return _baselineDatabase; } 
     protected set 
     { 
      _baselineDatabase= value; 
      if (value != null) 
       BaselineFile = null; 
     } 
    } 

    // Remainder of class 
} 

现在,我有具体的课程,我现在可以映射在NHibernate的,但这种感觉就像一个黑客攻击。有什么改进建议吗?

回答

1

地图它使用任何参考

fluentmapping

// ClassMap<RestorableEnvironment> 
RestorableEnvironmentMap() 
{ 
    ReferenceAny(e => e.BaselineEntity) 
     .EntityIdentifierColumn("entirtyid") 
     .EntityTypeColumn("entitytype") 
     .IdentityType<int>() 
     .MetaType<string>() 
     .AddMetaValue<E1>("e1") 
     .AddMetaValue<E2>("e2"); 
} 
+0

完美!对于Meta Mappings更多一点,我还看到:http://stackoverflow.com/questions/8989279/mapping-to-multiple-tables-with-fluent-nhibernate – 2012-04-12 21:28:45