NHibernate:将引用持久化到具有多个冲突类的接口

NHibernate:将引用持久化到具有多个冲突类的接口,nhibernate,Nhibernate,我在RestorableEnvironment和IBaselineEntity对象之间有一对多的关系:给定的RestorableEnvironment将有一个且只有一个IBaselineEntity对象,但每个IBaselineEntity对象可能绑定到0-nRestorableEnvironment对象。但是,IBaselineEntity通过两种方式之一实现:通过文件或数据库。我的课程(通常)如下: NHibernate需要在references语句中具体实现IBaselineEntity。

我在
RestorableEnvironment
IBaselineEntity
对象之间有一对多的关系:给定的
RestorableEnvironment
将有一个且只有一个
IBaselineEntity
对象,但每个
IBaselineEntity
对象可能绑定到0-n
RestorableEnvironment
对象。但是,
IBaselineEntity
通过两种方式之一实现:通过文件或数据库。我的课程(通常)如下:

NHibernate需要在references语句中具体实现
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中映射,但这感觉像是一个黑客。是否有任何改进建议?

将其映射为任何参考

使用fluentmapping

// ClassMap<RestorableEnvironment>
RestorableEnvironmentMap()
{
    ReferenceAny(e => e.BaselineEntity)
        .EntityIdentifierColumn("entirtyid")
        .EntityTypeColumn("entitytype")
        .IdentityType<int>()
        .MetaType<string>()
        .AddMetaValue<E1>("e1")
        .AddMetaValue<E2>("e2");
}
//类映射
RestorableEnvironmentMap()
{
ReferenceAny(e=>e.BaselineEntity)
.EntityIdentifierColumn(“EntityID”)
.EntityTypeColumn(“entitytype”)
.IdentityType()
.MetaType()
.AddMetaValue(“e1”)
.AddMetaValue(“e2”);
}

完美!有关元映射的更多信息,我还看到:
// ClassMap<RestorableEnvironment>
RestorableEnvironmentMap()
{
    ReferenceAny(e => e.BaselineEntity)
        .EntityIdentifierColumn("entirtyid")
        .EntityTypeColumn("entitytype")
        .IdentityType<int>()
        .MetaType<string>()
        .AddMetaValue<E1>("e1")
        .AddMetaValue<E2>("e2");
}