0

Fluentオートマッパーを使用してクラスをマップしています。現在、個人の要約情報を含む基本クラスと、完全な情報を含む派生クラスがあります。

interface IPersonSummary
{
    string Name { get; set; }
    DateTime? DOB { get; set; }
}

interface IPerson : IPersonSummary
{
    string Address { get; set; }
    string HairColor { get; set; }
}

public class PersonSummary : IPersonSummary
{
    public string Name { get; set; }
    public DateTime? DOB { get; set; }
}

public class Person : PersonSummary, IPerson
{
    public string Address { get; set; }
    public string HairColor { get; set; }
}

投影法を使用して、PersonSummaryにデータを入力するために必要なフィールドのみをデータベースからロードすることは可能ですが、マップする各フィールドを明示的に宣言する必要があります。これは、そもそもオートマッパーを使用するという全体的なポイントを打ち負かします。また、プロジェクションを使用してデータベースに新しいエントリを作成する方法を見つけることができませんでした。追加のフィールド(つまり、アドレスとヘアカラー)がデフォルト値に設定されています。PersonとPersonSummaryの両方が同じテーブルを使用するように設定するためのオーバーライドを提供しようとしましたが、予想どおり、Fluentはそれについて不満を述べました。

これらのクラスを同じテーブルにマッピングするにはどうすればよいですか?

4

1 に答える 1

0

識別子列を使用する AutomappingConfiguration で階層継承マッピングごとにテーブルを使用する

更新: それらを自動マッピングから除外し、以下のクラスマップを使用するか、アイデアを自動マッピングに組み込みます

class SharedMap<T> : ClassMap<T> where T : IPersonSummary
{
    public SharedMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.DOB);
    }
}

class PersonSummaryMap : SharedMap<PersonSummary>
{
    public PersonSummaryMap()
    {
        SchemaAction.None();
    }
}

class PersonMap : SharedMap<Person>
{
    public PersonMap()
    {
        Map(x => x.Address).Default("nowhere");
        Map(x => x.HairColor).Default("black");
    }
}
于 2013-02-15T09:46:46.180 に答える