【问题标题】:NHibernate: Persist Reference to Interface with Multiple Contrete ClassesNHibernate:对具有多个具体类的接口的持久引用
【发布时间】:2012-04-07 20:14:08
【问题描述】:

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

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 中进行映射,但这感觉就像是 hack。有什么改进的建议吗?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    将其映射为任何参考

    使用流利的映射

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

    【讨论】:

    猜你喜欢
    • 2015-12-14
    • 2012-12-17
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2018-12-12
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多