既存の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");
}
}