NHibernate: постоянная ссылка на интерфейс с несколькими конкретными классами - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть отношение 1-ко-многим между объектами RestorableEnvironment и IBaselineEntity: у данного RestorableEnvironment будет один и только один объект IBaselineEntity, но каждый объект 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, но это похоже на хак.Есть предложения по улучшению?

1 Ответ

1 голос
/ 07 апреля 2012

отобразите его как любую ссылку

, используя fluentmapping

// ClassMap<RestorableEnvironment>
RestorableEnvironmentMap()
{
    ReferenceAny(e => e.BaselineEntity)
        .EntityIdentifierColumn("entirtyid")
        .EntityTypeColumn("entitytype")
        .IdentityType<int>()
        .MetaType<string>()
        .AddMetaValue<E1>("e1")
        .AddMetaValue<E2>("e2");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...