0

既存のHMBマッピングファイルをFluentマッピングに移行しようとしていますが、次のクラス化された(簡略化された)マッピングがスタックしていません。

public interface IThing
{
    int Id { get; }
    string Name { get; }
    ISettings Settings { get; }
}

public class Thing : IThing { /* Interface implementation omitted */ }

public interface ISettings
{
    string SomeNamedSetting1 { get; }
    bool SomeNamedSetting2 { get; }
    int SomeNamedSetting3 { get; }
}

public class Settings : ISettings
{
    Dictionary<string, string> rawValues;

    public string SomeNamedSetting1 { get { return rawValues["SomeNamedSetting1"]; } }
    public bool SomeNamedSetting2 { get { return Convert.ToBoolean(rawValues["SomeNamedSetting2"]); } }
    public int SomeNamedSetting3 { get { return Convert.ToInt32(rawValues["SomeNamedSetting3"]); } }
}

インターフェイスに対してコーディングし、インターフェイスIThingで定義されたヘルパープロパティを介してその設定にアクセスしISettingsます。設定は、データベースの「設定」と呼ばれる1つのテーブルに格納されます。これは、Thingへの外部キーを持つキーと値のペアの集まりです。

既存のマッピングファイルは次のとおりです。

<component name="Settings" lazy="false" class="Settings, Test">
  <map name="rawValues" lazy="false" access="field" table="Setting">
    <key column="Id" />
    <index column="SettingKey" type="String" />
    <element column="SettingValue" type="String" />
  </map>
</component>

私が苦労しているのは、class属性に相当するFluentが見つからないため、コンポーネントの定義です。これが私がこれまでに持っているものです:

public class ThingMap : ClassMap<Thing>
{
    public ThingMap()
    {
        Proxy<IThing>();
        Id(t => t.Id);
        Map(t => t.Name);

        // I think this is the equivalent of the private field access
        var rawValues = Reveal.Member<Settings, IDictionary<string, string>>("rawValues");

        // This isn't valid as it can't convert ISettings to Settings
        Component<Settings>(t => t.Settings);

        // This isn't valid because rawValues uses Settings, not ISettings
        Component(t => t.Settings, m =>
        {
            m.HasMany(rawValues).
            AsMap("SettingKey").
            KeyColumn("InstanceId").
            Element("SettingValue").
            Table("Setting");
        });

        // This is no good because it complains "Custom type does not implement UserCollectionType: Isotrak.Silver.IInstanceSettings"
        HasMany<InstanceSettings>(i => i.InstanceSettings).
            AsMap("SettingKey").
            KeyColumn("InstanceId").
            Element("SettingValue").
            Table("Setting");
    }
}
4

1 に答える 1

1

同じボートに乗っている人のために、私は結局それを割った。

Component<Settings>(i => i.Settings, m =>
{
    m.HasMany(rawValues).
    AsMap<string>("SettingKey").
    KeyColumn("InstanceId").
    Element("SettingValue").
    Table("Setting");
});

今は明らかなようです!

于 2013-01-28T13:34:10.873 に答える