Наследование, отображающееся с быстрым NHibernate

Параметры, которые вы говорите, называются varargs .

Некоторые отличия:

  • varargs могут быть не переданы никакие параметры (в основном игнорируются), null или неопределенное количество аргументов, в то время как параметры массива должны передаваться массивом или null
  • varargs должен быть последним параметром вашего метода, тогда как это не имеет значения для параметров массива. Это связано с этим специальным свойством varargs, что, вероятно, является самым существенным различием между двумя вашими вещами:

Три периода после последнего параметра указывают, что окончательный аргумент может передаваться как массив или как последовательность аргументов

blockquote>

Источник

Так, например, этот метод:

public void myMethod(String... args) {}

Может быть вызвано любым из них:

String[] myStrings = {"a", "b", "c"};
myMethod(myStrings);
myMethod("a", "b", "c");

См. этот для хорошего объяснения при использовании varargs.

26
задан 10 revsJim 18 March 2009 в 15:11
поделиться

3 ответа

Ну, я не уверен, что это совершенно правильно, но это могло бы работать... Если кто-либо может сделать это более чисто, я хотел бы видеть его (серьезно, я был бы; это - интересная проблема).

Используя точные определения классов Вы дали, вот отображения:

public class ItemMap : ClassMap<Item>
{
    public ItemMap()
    {
        Id(x => x.ItemId);
        Map(x => x.ItemType);
        Map(x => x.FieldA);

        AddPart(new ConcreteItemYMap());
    }
}

public class SubItemMap : ClassMap<SubItem>
{
    public SubItemMap()
    {
        WithTable("Item");

        // Get the base map and "inherit" the mapping parts
        ItemMap baseMap = new ItemMap();
        foreach (IMappingPart part in baseMap.Parts)
        {
            // Skip any sub class parts... yes this is ugly
            // Side note to anyone reading this that might know:
            // Can you use GetType().IsSubClassOf($GenericClass$)
            // without actually specifying the generic argument such
            // that it will return true for all subclasses, regardless
            // of the generic type?
            if (part.GetType().BaseType.Name == "JoinedSubClassPart`1")
                continue;
            AddPart(part);
        }
        Map(x => x.FieldB);
        AddPart(new ConcreteItemXMap());
    }
}

public class ConcreteItemXMap : JoinedSubClassPart<ConcreteItemX>
{
    public ConcreteItemXMap()
        : base("ItemId")
    {
        WithTableName("ConcreteItemX");
        Map(x => x.FieldC);
    }
}

public class ConcreteItemYMap : JoinedSubClassPart<ConcreteItemY>
{
    public ConcreteItemYMap()
        : base("ItemId")
    {
        WithTableName("ConcreteItemY");
        Map(x => x.FieldD);
    }
}

Те отображения производят два файла hbm.xml как так (некоторые посторонние данные, удаленные для ясности):

  <class name="Item" table="`Item`">
    <id name="ItemId" column="ItemId" type="Int32">
      <generator class="identity" />
    </id>
    <property name="FieldA" type="String">
      <column name="FieldA" />
    </property>
    <property name="ItemType" type="String">
      <column name="ItemType" />
    </property>
    <joined-subclass name="ConcreteItemY" table="ConcreteItemY">
      <key column="ItemId" />
      <property name="FieldD">
        <column name="FieldD" />
      </property>
    </joined-subclass>
  </class>

  <class name="SubItem" table="Item">
    <id name="ItemId" column="ItemId" type="Int32">
      <generator class="identity" />
    </id>
    <property name="FieldB" type="String">
      <column name="FieldB" />
    </property>
    <property name="ItemType" type="String">
      <column name="ItemType" />
    </property>
    <property name="FieldA" type="String">
      <column name="FieldA" />
    </property>
    <joined-subclass name="ConcreteItemX" table="ConcreteItemX">
      <key column="ItemId" />
      <property name="FieldC">
        <column name="FieldC" />
      </property>
    </joined-subclass>
  </class>

Это ужасно, но похоже, что это могло бы генерировать применимый файл отображения, и это Быстро!:/Вы могли бы быть в состоянии настроить идею еще немного для получения точно, что Вы хотите.

1
ответ дан Stuart Childs 25 September 2019 в 08:00
поделиться

Строка кода: if (part.GetType (). BaseType.Name == "JoinedSubClassPart1") можно переписать следующим образом:

part.GetType().BaseType.IsGenericType && part.GetType().BaseType.GetGenericTypeDefinition() == typeof(JoinedSubClassPart<>)
1
ответ дан 28 November 2019 в 07:52
поделиться

Вот как я решил мою проблему наследования:

public static class DataObjectBaseExtension
{
    public static void DefaultMap<T>(this ClassMap<T> DDL) where T : IUserAuditable 
    {
        DDL.Map(p => p.AddedUser).Column("AddedUser");
        DDL.Map(p => p.UpdatedUser).Column("UpdatedUser");
    }
}

Вы можете добавить это в свой конструктор карты SuperClass:

internal class PatientMap : ClassMap<Patient>
{
    public PatientMap()
    {
        Id(p => p.GUID).Column("GUID");
        Map(p => p.LocalIdentifier).Not.Nullable();
        Map(p => p.DateOfBirth).Not.Nullable();
        References(p => p.Sex).Column("RVSexGUID");
        References(p => p.Ethnicity).Column("RVEthnicityGUID");

        this.DefaultMap();
    }


}
1
ответ дан 28 November 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: