如何使用功能NHibernate ReferencesAny映射?(How do I use Flu

2019-09-21 03:24发布

我读过很多关于流利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表可自动映射。 如果是这样,我需要找出如何做到这一点。 现在我会做与流利的传统方式。

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,但我仍然在学习曲线赞叹不已。 :)

谢谢,拉斯

Answer 1:

因为家庭和客户端不共享比其他对象的基类,你必须把它声明为这样:

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


文章来源: How do I use Fluent NHibernate ReferencesAny mapping?