1

Fluent NHibernate の ReferencesAny についてはよく読んだことがありますが、完全な例は見ていません。おおむね理解できたと思いますが、理解できない部分があります。クラス マッピングReferencesAny(x => x.MemberName)では、参照される 1 つ以上のクラスとの関係を定義するために使用されます。とはMemberName? どのように定義され、データベースにデータを作成するためにどのように使用されますか。

3 つのテーブルがあり、1 つのテーブルのレコードは、他の 2 つのテーブルのいずれかのレコードを参照できます。最初の 2 つは自動マッピングされるため、Id フィールドは特に定義されていません。

public class Household
{
    public virtual string Name { get; set; }

    public virtual IList<AddressXref> AddressXrefs { get; set; }
}

public class Client
{
    public virtual string Name { get; set; }

    public virtual IList<AddressXref> AddressXrefs { get; set; }
}

AddressXrefテーブルを自動マップできるかどうかわかりません。もしそうなら、私もそれを行う方法を見つける必要があります。今のところ、Fluent を使用した従来の方法で行います。

public class AddressXref
{
    public virtual int id { get; set; }
    public virtual string TableName { get; set; }
    public virtual Int32 Table_id { get; set; }
    public virtual string Street { get; set; }
    public virtual string City { get; set; }
}

class AddressXrefMap : ClassMap<AddressXref>
{
    public AddressXrefMap()
    {
        Table("AddressXref");
        Id(x => x.id);
        Map(x => x.TableName);
        Map(x => x.Table_id);
        Map(x => x.Street);
        Map(x => x.City);

        ReferencesAny(x => x.TableRef)
            .AddMetaValue<Household>(typeof(Household).Name)
            .AddMetaValue<Client>(typeof(Client).Name)
            .EntityTypeColumn("TableName")
            .EntityIdentifierColumn("Table_id")
            .IdentityType<int>();
    }
}

私が助けを必要としている部分は、TableRefで参照されているReferencesAny()のメンバーがAddressXrefクラスでどのように定義されているかです。

また、データ レコードを作成するときにコードでどのように使用されますか? 私はそれがこれに似ていると思います:

Household Household = new Household();
Household.Name      = "Household #1";

AddressXref AddrXref = new AddressXref();
AddrXref.Street1   = "123 Popular Street";
AddrXref.City      = "MyTown";
AddrXref.TableRef  = Household;

Session.SaveOrUpdate(AddrXref);    

私は NHibernate で Fluent を使用するのが大好きですが、学習曲線にはまだ驚かされます。:)

ありがとう、ラス

4

1 に答える 1

3

HouseholdとClientの両方がオブジェクト以外の基本クラスを共有しないため、次のように宣言する必要があります。

public class AddressXref
{
    public virtual int Id { get; set; }
    public virtual object TableRef { get; set; }
    public virtual string Street { get; set; }
    public virtual string City { get; set; }
}

このようにテストします

if (addrXref.TableRef is HouseHold)
    // it's a household
于 2012-08-13T15:21:23.123 に答える