Как использовать карту Fluent NHibernate ReferencesAny?

Я много читал о ReferencesAny Fluent NHibernate, но не видел полного примера. Я думаю, что понимаю большую часть этого, но есть одна часть, которую я не понимаю. В сопоставлении классов ReferencesAny(x => x.MemberName) используется для определения отношения к одному или нескольким классам, на которые ссылаются. Что такое MemberName? Как он определяется и как используется для создания данных в базе данных.

У меня есть три таблицы, записи в одной таблице могут ссылаться на записи в одной из двух других таблиц. Первые два сопоставляются автоматически, поэтому поле 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);    

Мне нравится использовать Fluent с NHibernate, но я все еще поражен кривой обучения. :)

Спасибо, Расс


person Russ Petersen    schedule 11.08.2012    source источник


Ответы (1)


поскольку и 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
person Firo    schedule 13.08.2012