1

我已经阅读了很多关于 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>();
    }
}

我需要帮助的部分是在类中定义的成员是如何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 回答