Трехстороннее соединение в nhibernate - PullRequest
1 голос
/ 19 июля 2011

Я пытаюсь создать сопоставление NHibernate для следующих таблиц:

AutomatedTestSequence - SequenceID, SequenceName
TestStep - StepID, StepDisplay
StepSequenceMapping - SequenceID, StepID
TestParameters - SequenceID, StepID, ParamID, ParamName, ParamValue

Мои классы и сопоставления:

public class AutomatedTestSequence
{
    public virtual int Id
    {
        get;
        set;
    }

    public virtual string Name
    {
        get;
        set;
    }

    public virtual IList<TestStep> StepsList
    {
        get;
        set;
    }
}

, и сопоставление:

<class name="AutomatedTestSequence" table="AutomatedTestSequence">
  <id name="Id" column="SequenceID"/>
  <property name="Name" column="SequenceName"/>

  <bag name="TestStep" table="StepSequenceMapping" cascade="none" lazy="false">
    <key column ="SequenceID" />
    <many-to-many class="TestStep" column="StepID" />
  </bag>
</class>

Второй класс:

public class TestStep
{
    public virtual int Id
    {
        get;
        set;
    }

    public virtual string Display
    {
        get;
        set;
    }

    public virtual IList<StepParameter> StepParameterList
    {
        get;
        set;
    }
}

и отображение:

<class name="TestStep" table="TestStep">
  <id name="Id" column="StepID"/>
  <property name="Display" column="StepDisplay"/>

  <bag name="TestParameters" table="TestParameters" cascade="none" lazy="false">
    <key column ="StepID" />
    <many-to-many class="TestParameters" column="ParameterId"/>
  </bag>
</class>

Третий класс:

public class StepParameter
{
    public virtual int Id
    {
        get;
        set;
    }

    public virtual string Name
    {
        get;
        set;
    }

    public virtual string value
    {
        get;
        set;
    }
}

и отображение:

<class name="TestParameters" table="TestParameters">
  <id name="Id" column="ParamID"/>
  <property name="Name" column="ParamName" />
  <property name="Value" column="ParamValue" />
</class>

Моя проблема заключается в том, что параметр связан с определенным шагом в определенной последовательности автоматической проверки (например, у меня есть параметр с именем StartDate, для шага он может иметь значение 7AMOpen Application в автоматической последовательности Morning Sequence и значение 7PM для шага Open Application в автоматической последовательности Evening Sequence), но в текущем отображении, которое у меня есть, параметр связан с шагом независимо от того, к какому автоматическому теступоследовательность, к которой он принадлежит.Как изменить сопоставление для включения идентификатора автоматической последовательности тестирования при сопоставлении параметров?

1 Ответ

0 голосов
/ 19 июля 2011

Я не уверен, что эта классовая структура исправлена.Если не учитывать это:

public class AutomatedTestSequence
{
    public virtual int Id { get; set; }

    public virtual string Name { get; set; }
    public virtual IList<ParameterDictionary> StepParameters { get; set; }
}

public class TestStep
{
    public virtual int Id { get; set; }

    public virtual string Display { get; set; }
}

public class ParameterDictionary
{
    public virtual AutomatedTestSequence Sequence { get; set; }
    public virtual TestStep Step { get; set; }
    /// <summary>
    /// dictionary with paramtername/value pairs
    /// </summary>
    public virtual IDictionary<string, string> Parameter { get; set; }

    public override bool Equals(object obj)
    {
        var other = obj as ParameterDictionary;
        return (other != null) && (Sequence == other.Sequence) && (Step == other.Step);
    }

    public override int GetHashCode()
    {
        return Sequence.GetHashCode() ^ Step.GetHashCode();
    }
}


class AutomatedTestSequenceMap : ClassMap<AutomatedTestSequence>
{
    public AutomatedTestSequenceMap()
    {
        Id(seq => seq.Id, "AutomatedTestSequence");

        Map(seq => seq.Name, "SequenceName");

        HasMany(seq => seq.StepParameters)
            .Table("StepSequenceMapping")
            .KeyColumn("SequenceID");
    }
}

class TestStepMap : ClassMap<TestStep>
{
    public TestStepMap()
    {
        Id(step => step.Id, "StepID");

        Map(step => step.Display, "StepDisplay");
    }
}

class ParameterDictionaryMap : ClassMap<ParameterDictionary>
{
    public ParameterDictionaryMap()
    {
        Table("StepSequenceMapping");

        CompositeId()
            .KeyReference(spmap => spmap.Sequence, "SequenceID")
            .KeyReference(spmap => spmap.Step, "StepID");

        HasMany(spmap => spmap.Parameter)
            .Table("TestParameters")
            .KeyColumns.Add("SequenceID", "StepID")
            .AsMap("ParamName")
            .Element("ParamValue");
    }
}

, если вы не можете или не хотите использовать FluentNHibernate, дайте мне знать, и я опубликую xmlmappings.

примечания: ParamID действительно нужно, еслион автоматически генерируется в базе данных, затем в порядке, если он установлен программно, то приведенный выше код необходимо настроить.

надеюсь, что это поможет

РЕДАКТИРОВАТЬ: сопоставления xml

  <class mutable="true" name="AutomatedTestSequence" table="`AutomatedTestSequence`">
    <id name="Id" type="System.Int32" column="SequenceId">
      <generator class="identity" />
    </id>
    <property name="Name" type="System.String">
      <column name="SequenceName" />
    </property>
    <bag name="StepParameters" table="StepSequenceMapping" mutable="true">
      <key>
        <column name="SequenceID" />
      </key>
      <one-to-many class="ParameterDictionary" />
    </bag>
  </class>

  <class mutable="true" name="TestStep" table="`TestStep`">
    <id name="Id" type="System.Int32" column="StepID">
      <generator class="identity" />
    </id>
    <property name="Display" type="System.String">
      <column name="StepDisplay" />
    </property>
  </class>

  <class mutable="true" name="ParameterDictionary" table="StepSequenceMapping">
    <composite-id mapped="false">
      <key-many-to-one name="Sequence" class="AutomatedTestSequence" column="SequenceID"/>
      <key-many-to-one name="Step" class="TestStep" column="StepID"/>
    </composite-id>
    <map name="Parameter" table="TestParameters" mutable="true">
      <key>
        <column name="SequenceID" />
        <column name="StepID" />
      </key>
      <index type="System.String" column="ParamName"/>
      <element type="System.String" column="ParamValue"/>
    </map>
  </class>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...