我如何使用Fluent NHibernate ReferencesAny映射?

时间:2012-08-11 06:15:04

标签: nhibernate polymorphic-associations fluent automapping

我已经阅读了很多关于Fluent NHibernate的ReferencesAny,但我还没有看到一个完整的例子。我想我大部分都理解了,但有一部分我没有得到。在类映射中,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>();
    }
}

我需要帮助的部分是TableRefReferencesAny()中引用的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,但我仍然对学习曲线感到惊讶。 :)

谢谢, 拉斯

1 个答案:

答案 0 :(得分:2)

由于Household和Client都不共享除object之外的基类,因此必须将其声明为:

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